Привязка списка, принадлежащего другому объекту, в привязке пользовательской модели в ASP.NET MVC - PullRequest
2 голосов
/ 12 марта 2010

Я понимаю, что что-то подобное спросили, но это может немного отличаться

Ниже мой объект Event:

Event : IEvent
  public int Id
  public string Title
  public List<EventContact> Contacts

И EventContact:

EventContact
  public int Id
  public string Name
  public string Email

Итак, Event имеет список EventContact объектов. Теперь Event также реализует IEvent - отсюда и привязка пользовательской модели. Я использую IEvent вместо Event, поэтому, когда механизм связывания моделей по умолчанию пытается выполнить свою задачу, он сообщает мне, что не может создать IEvent.

У меня есть мой вид с заполненной контактной информацией:

<input type="text" name="contact[0].Name" value="DB Value"/>
<input type="text" name="contact[1].Name" value="DB Value"/>
<input type="text" name="contact[2].Name" value="DB Value"/>

<input type="text" name="contact[0].Email" value="DB Value"/>
<input type="text" name="contact[1].Email" value="DB Value"/>
<input type="text" name="contact[2].Email" value="DB Value"/>

<!-- Event fields, etc -->

Итак, в моем пользовательском связывателе модели я могу видеть все значения - сладко! Единственное, я действительно не уверен, как получить все поля контактов и создать список контактов из них, а также связать все поля событий.

Любая помощь приветствуется!

1 Ответ

1 голос
/ 15 марта 2010

Чтобы выполнить вышеизложенное, я просто запросил существующий контекст привязки ValueProvider для всех полей EventContact и отправил его вместе с привязкой модели по умолчанию с новым контекстом привязки:

IDictionary<string, ValueProviderResult> contactValueProvider = bindingContext.ValueProvider
            .Select(t => new { t.Key, t.Value })
            .Where(t => t.Key.Contains("EventContact"))
            .ToDictionary(t => t.Key, t => t.Value);

ModelBindingContext contactBindingContext = new ModelBindingContext()
        {
            ModelName = "EventContact",
            ModelState = bindingContext.ModelState,
            ModelType = typeof(List<EventContact>),
            PropertyFilter = bindingContext.PropertyFilter,
            ValueProvider = contactValueProvider
        };

_event.Contacts = ModelBinders.Binders.DefaultBinder.BindModel(controllerContext, contactBindingContext) as IQueryable<EventContact>;

Это работает, так что я счастлив: P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...