MVC3 IModelBinder и обновление данных члена - PullRequest
0 голосов
/ 22 ноября 2011

У меня есть такой класс

public class Position
{
     public string Title { get; set; }
     public IEnumerable<string> PhoneNumbers { get; set; }
}

Я хотел использовать текстовое поле для приема телефонных номеров по одному на строку. После этого модель явно не связывается правильно, поэтому я нашел IModelBinder, который может помочь с этим, но я не вижу, как я могу внедрить преобразованные данные обратно в модель.

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
     var phones = bindingContext.ValueProvider.GetValue("phones");
     var values = phones.AttemptedValue;

     var phoneList = ..... //split and stuff

     //now what? how to set it back?

Спасибо

Ответы [ 2 ]

0 голосов
/ 23 ноября 2011

Создайте новый класс PhoneNumberList и используйте его вместо IEnumerable<string> в вашей модели. Затем вы можете создать пользовательский механизм связывания для PhoneNumberList, скопировав существующий код. В противном случае привязка к существующей модели Position не будет затронута.

В качестве альтернативы (но более сложное решение) - вы можете сохранить существующее определение IEnumerable<string>. Вы бы создали подкласс DefaultModelBinder и изучили бы PropertyMetadata любого свойства IEnumerable<string>. Если он содержит некоторые идентифицирующие метаданные, которые вы добавили (например, через атрибут), тогда он может выполнить пользовательскую привязку, в противном случае он возвращается к базовой привязке.

В качестве отступления - вы также можете рассмотреть возможность использования bindingContext.ModelName вместо жесткого кодирования ключа провайдера значений для "телефонов":

var phones = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
0 голосов
/ 22 ноября 2011

Создайте новый экземпляр вашей модели, заполните его свойства и верните его. Вот и все.

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
     var phones = bindingContext.ValueProvider.GetValue("phones");
     var values = phones.AttemptedValue;

     var phoneList = ..... //split and stuff
//IE
    Position position = new Postion();
    position.PhoneNumbers = phoneList;
    return position;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...