MVC 2, изменения IModelBinder & ValueProvider

Я пытаюсь мигрировать на ASP.Net MVC 2 и встретить некоторые проблемы. Вот тот: Я должен был связать непосредственно Словарь как результат сообщения представления.

В ASP.Net MVC 1 это работало отлично с помощью пользовательского 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
}

Это работало в паре с некоторым умным HtmlBuilder, который отобразил словарь данных.

Проблема, которую я встречаю теперь, состоит в том, что ValueProvider не является Словарь <> больше, это - IValueProvider, которые только позволяют получать значения, имя которых известно

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

Это действительно не прохладно, поскольку я не могу выполнить свой умный парсинг...

Вопрос:

  1. Там другой путь состоит в том, чтобы получить все ключи?
  2. Вы знаете другой способ связать набор элементов HTML к Словарю

Спасибо за Ваши предложения

O.

5
задан Mose 24 February 2010 в 12:49
поделиться

1 ответ

Я не думаю, что вы больше сможете делать это в MVC 2.
В качестве альтернативы вы могли бы расширить DefaultModelBinder и переопределить один из его виртуальных методов, например GetModelProperties, а затем изменить ModelName внутри ModelBindingContext. Другой вариант - реализовать собственный MetadataProvider для вашего типа Dictionary, вы также можете изменить название модели там.

1
ответ дан 15 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: