Frage

Ich versuche, auf ASP.NET MVC 2 zu migrieren und einige Probleme zu treffen. Hier ist eins: Ich musste direkt a binden Wörterbuch als Ergebnis eines Ansichtspostens.

In ASP.NET MVC 1 funktionierte es perfekt mit einem benutzerdefinierten 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
}

Es funktionierte praktisch mit einem intelligenten HTMLBuilder, der das Wörterbuch von Daten anzeigt.

Das Problem, das ich jetzt treffe, ist das Valueprovider ist kein Wörterbuch mehr <>, es ist ein IvalueProvider, der es nur erlaubt, Werte zu erhalten, deren Name bekannt ist

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

Das ist wirklich nicht cool, da ich meine intelligente Parsen nicht ausführen kann ...

Frage :

  1. Gibt es eine andere Möglichkeit, alle Schlüssel zu bekommen?
  2. Kennen Sie eine andere Möglichkeit, eine Sammlung von HTML -Elementen an ein Wörterbuch zu binden

Vielen Dank für Ihre Vorschläge

Ö.

War es hilfreich?

Lösung

Ich glaube nicht, dass Sie es in MVC 2 so machen können.
Alternativ können Sie defaultModelBinder erweitern und eine seiner virtuellen Methoden wie GetModelProperties überschreiben und dann den ModelName innerhalb des Modellbindungscontext ändern. Eine weitere Option ist die Implementierung eines benutzerdefinierten Metadataproviders für Ihren Wörterbuchtyp. Sie können auch den Modellnamen dort ändern.

Andere Tipps

Obwohl diese Frage "beantwortet" gekennzeichnet ist, denke ich, dass das Folgende hilfreich sein könnte. Ich hatte das gleiche Problem und sah mir den Quellcode des Systems an.web.mvc.defaultvalueProvider. Es erhält seine Werte von der Routedata, der Abfragezeichenfolge oder aus einer Anforderungsformulareingabe (genau in dieser Reihenfolge). Um alle Schlüssel zu sammeln (welche Sie in Ihrer ersten Frage stellen), habe ich die folgende Helfermethode geschrieben.

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

Sie können diese Methode verwenden, um über die Tasten aufzuzählen:

foreach (string key in GetKeys(controllerContext))
{
    // Do something with the key value.
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top