Question

Je suis en train de migrer vers ASP.Net MVC 2 et répondre à certaines questions. Voici un: Je avais besoin de lier directement un Dictionnaire à la suite d'un poste de vue.

Dans ASP.Net MVC 1, il a parfaitement fonctionné en utilisant une coutume 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
}

Il a travaillé en paire avec un certain HtmlBuilder intelligent qui affiche le dictionnaire de données.

Le problème que je rencontre est maintenant que ValueProvider est pas un dictionnaire <> plus, il est un IValueProvider qui ne permettent d'obtenir des valeurs dont le nom est connu

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

Ceci est vraiment pas cool que je ne peux pas faire mon analyse intelligente ...

Question:

  1. Y at-il une autre façon d'obtenir toutes les clés?
  2. Connaissez-vous une autre façon de lier une collection d'éléments HTML à un dictionnaire

Merci pour vos suggestions

O.

Était-ce utile?

La solution

Je ne pense pas que vous serez en mesure de le faire de cette façon plus dans MVC 2.
Sinon, vous pouvez étendre DefaultModelBinder et remplacer l'une de ses méthodes virtuelles comme GetModelProperties puis modifiez le ModelName à l'intérieur du ModelBindingContext. Une autre option serait de mettre en œuvre un MetadataProvider personnalisé pour votre type dictionnaire, vous pouvez modifier le nom du modèle aussi.

Autres conseils

Bien que cette question a été marquée répondit: «Je pense que le suivant peut être utile. J'ai eu le même problème et a eu un coup d'oeil au code source du System.Web.Mvc.DefaultValueProvider. Il obtient ses valeurs de la RouteData, la chaîne de requête ou d'une soumission de formulaire de demande (dans cet ordre exact). Pour recueillir toutes les clés (qui est ce que vous demandez dans votre première question) je l'ai écrit la méthode d'assistance suivante.

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;
}

Vous pouvez utiliser cette méthode pour énumérer les clés:

foreach (string key in GetKeys(controllerContext))
{
    // Do something with the key value.
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top