#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 Стива Сандерсона, которое позволяет более динамично редактировать коллекции.