Asp.Net Регистрационная форма MVC 2 для объекта с коллекциями

#jquery #.net #asp.net-mvc-2 #data-binding

#jquery #.net #asp.net-mvc-2 #привязка данных

Вопрос:

Я использую Asp.Net MVC 2 и у меня есть ситуация, когда я создаю форму создания / редактирования для класса, некоторые из его свойств которого являются коллекциями. Пользователь может добавлять N элементов в каждую коллекцию. Моя ViewModel выглядит так:

 public class Person  
{  
   public string Name {get; set;}  
   public DateTime BirthDate {get; set;}     
   public IList<Address> Addresses {get; set;}
}

public class Address
{
   public string StreetName {get; set}  
   public int Number {get; set;}  
   public string Neighborhood {get; set;}
}  
  

Требуется, чтобы пользователь нажимал кнопку отправки только один раз, то есть только одну форму. Поэтому я попытался использовать решение, показанное здесь Стивеном Сандерсоном http://blog.stevensanderson.com/2010/07/12/editing-a-variable-length-list-knockout-style / , но для этого требуется, чтобы мое представление наследовалось от IEnumerable . В моем сценарии у меня есть один человек, у которого много адресов, много телефонов и т. Д., А не коллекция o Person.

Я могу добавить элементы формы с помощью jQuery, но я не знаю, как выполнить привязку данных к контроллеру.

Кто-нибудь может мне помочь с этим?

Большое спасибо!

Ответ №1:

Прочтите эту статью Филла Хаака о привязке модели к списку.

Здесь он демонстрирует именно то, о чем вы спрашиваете, определяя каждый элемент в коллекции как:

     <input type="hidden" name="products.Index" value="cold" />
    <input type="text" name="products[cold].Name" value="Beer" />
    <input type="text" name="products[cold].Price" value="7.32" />

    <input type="hidden" name="products.Index" value="123" />
    <input type="text" name="products[123].Name" value="Chips" />
    <input type="text" name="products[123].Price" value="2.23" />
  

Ответ №2:

У Phill Haak есть отличный пост о таком сценарии:

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

В сообщении есть различные примеры.

 <% for (int i = 0; i < 3; i  ) { %>

  <%: Html.TextBoxFor(m => m.Addresses[i].StreetName) %>
  <%: Html.TextBoxFor(m => m.Addresses[i].Number) %>
  <%: Html.TextBoxFor(m => m.Addresses[i].Neighborhood) %> 

<% } %>
  

Для добавления значений с помощью javascript вам просто нужно соблюдать соглашения об именовании:

 <input type="text" name="Addresses[0].StreetName" />
<input type="text" name="Addresses[0].Number" />
<input type="text" name="Addresses[0].Neighborhood" />

<input type="text" name="Addresses[1].StreetName" />
<input type="text" name="Addresses[1].Number" />
<input type="text" name="Addresses[1].Neighborhood" />
  

PS не уверен в именах. Проверьте, как он будет сгенерирован первым образцом.

Ответ №3:

Ответы Самича и Джейми верны и будут работать, но могут быть немного неуклюжими в работе. Я бы порекомендовал расширение Collections Стива Сандерсона, которое позволяет более динамично редактировать коллекции.