Pregunta

Estoy tratando de migrar a ASP.NET MVC 2 y satisfacer algunos problemas. Aquí hay uno: necesitaba unir directamente un Diccionario Como resultado de una publicación de vista.

En ASP.NET MVC 1 funcionó perfectamente usando una personalizada Imodelbinder :

/// <summary>
/// Bind Dictionary<int, int>
/// 
/// convention : <elm name="modelName_key" value="value"></elm>
/// </summary>
public class DictionaryModelBinder : IModelBinder
{
    #region IModelBinder Members

    /// <summary>
    /// Mandatory
    /// </summary>
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        IDictionary<int, int> retour = new Dictionary<int, int>();

        // get the values
        var values = bindingContext.ValueProvider;
        // get the model name
        string modelname = bindingContext.ModelName + '_';
        int skip = modelname.Length;

        // loop on the keys
        foreach(string keyStr in values.Keys)
        {
            // if an element has been identified
            if(keyStr.StartsWith(modelname))
            {
                // get that key
                int key;
                if(Int32.TryParse(keyStr.Substring(skip), out key))
                {
                    int value;
                    if(Int32.TryParse(values[keyStr].AttemptedValue, out value))
                        retour.Add(key, value);
                }
            }
        }
        return retour;
    }

    #endregion
}

Funcionó en pares con un Smart HTMLBuilder que mostró el diccionario de datos.

El problema que conozco ahora es que ValueProvider ya no es un diccionario <>, es un ivalueprovider que solo permite obtener valores cuyo nombre se conoce

public interface IValueProvider
{
    bool ContainsPrefix(string prefix);
    ValueProviderResult GetValue(string key);
}

Esto realmente no es genial ya que no puedo realizar mi análisis inteligente ...

Pregunta :

  1. ¿Hay otra forma de obtener todas las llaves?
  2. ¿Conoces otra forma de vincular una colección de elementos HTML a un diccionario?

Gracias por tus sugerencias

O.

¿Fue útil?

Solución

No creo que ya puedas hacerlo de esta manera en MVC 2.
Alternativamente, puede extender el defaultModelBinder y anular uno de sus métodos virtuales como getModelProperties y luego cambiar el nombre de modele dentro del modelo ModelBindingContext. Otra opción sería implementar un metadataprovider personalizado para su tipo de diccionario, también puede cambiar el nombre del modelo allí.

Otros consejos

Aunque esta pregunta ha sido marcada 'respondida', creo que lo siguiente puede ser útil. Tuve el mismo problema y eché un vistazo al código fuente del sistema.web.mvc.defaultValueProvider. Obtiene sus valores de Routedata, la cadena de consulta o desde un envío del formulario de solicitud (en ese orden exacto). Para recopilar todas las claves (que es lo que pides en tu primera pregunta) escribí el siguiente método de ayuda.

private static IEnumerable<string> GetKeys(ControllerContext context)
{
    List<string> keys = new List<string>();
    HttpRequestBase request = context.HttpContext.Request;
    keys.AddRange(((IDictionary<string,
        object>)context.RouteData.Values).Keys.Cast<string>());
    keys.AddRange(request.QueryString.Keys.Cast<string>());
    keys.AddRange(request.Form.Keys.Cast<string>());
    return keys;
}

Puede usar este método para enumerar sobre las claves:

foreach (string key in GetKeys(controllerContext))
{
    // Do something with the key value.
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top