2012-06-28 2 views
1

У меня есть модель заявителя, который содержит список тегов:ASP.NET MVC3 Пользовательские Binder вопросы Модель

public class Applicant 
{ 
    public virtual IList<Tag> Tags { get; protected set; } 
} 

Когда форма представляется, есть поле ввода, который содержит разделенный запятыми список тегов пользователь имеет вход. У меня есть пользовательские модели связующего, чтобы преобразовать этот список в коллекцию:

public class TagListModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var incomingData = bindingContext.ValueProvider.GetValue("tags").AttemptedValue; 
     IList<Tag> tags = incomingData.Split(',').Select(data => new Tag { TagName = data.Trim() }).ToList(); 
     return tags; 
    } 
} 

Однако, когда моя модель заполняется и передается в действие контроллера на POST, тегах свойство все еще пустой список. Любая идея, почему он не заполняет список правильно?

+0

http://prideparrot.com/blog/archive/2012/6/customizing_property_binding_through_attributes – VJAI

+0

@Mark Я не вижу причин, чтобы заменить всю модель связующего, как ваша ссылка может предложить. –

+0

Пожалуйста, проверьте мой ответ – VJAI

ответ

2

Проблема в том, у вас есть protected набор аксессоры в Tags собственности. Если вы измените это на public, как показано ниже, все будет работать нормально.

public class Applicant 
{ 
    public virtual IList<Tag> Tags { get; set; } 
} 
2

Подлинность модели связывает только представленные значения. Он не связывает значения, отображаемые в представлении.

Вам необходимо создать пользовательский шаблон EditorTemplate для визуализации тегов по мере необходимости.

1

MVC может already bind to a List, я бы рекомендовал использовать встроенную технологию, которая уже делает то, что вам нужно.

Я не заметил никакого кода о добавлении связующего, вы добавили свой ModelBinder к связующим?

protected void Application_Start() 
{ 
    ModelBinders.Binders.Add(typeof(IList<Tag>), new TagListModelBinder()); 
} 
+0

Да, я добавил его к связующим, и это называется. Он просто не заполняется в параметре метода действия. – arknotts

+0

Я посмотрел вашу ссылку о привязке к списку. К сожалению, это не будет работать в моем сценарии, поскольку javascript, который я использую на стороне клиента, помещает все в одно поле ввода. – arknotts

 Смежные вопросы

  • Нет связанных вопросов^_^