Я пытаюсь мигрировать на 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);
}
Это действительно не прохладно, поскольку я не могу выполнить свой умный парсинг...
Вопрос:
Спасибо за Ваши предложения
O.
Я не думаю, что вы больше сможете делать это в MVC 2.
В качестве альтернативы вы могли бы расширить DefaultModelBinder и переопределить один из его виртуальных методов, например GetModelProperties, а затем изменить ModelName внутри ModelBindingContext. Другой вариант - реализовать собственный MetadataProvider для вашего типа Dictionary, вы также можете изменить название модели там.