#asp.net-mvc #collections
#asp.net-mvc #Коллекции
Вопрос:
Вопрос довольно интересный: как я могу передать коллекцию контроллеру, когда у меня есть строго типизированное представление для создания шаблона. Это моя ViewModel:
public class AgencyOfficiesItem
{
public string Address { get; set; }
public List<PhoneItem> Phones { get; set; }
public List<SelectListItem> CitiesList { get; set; }
}
public class PhoneItem {
public string Phone { get; set; }
public string PhoneOperator { get; set; }
}
Итак, я хочу создать представление для создания объекта phone, в котором есть поля phone operator и phone number. Но, интересно то, что я хочу иметь коллекцию из объектов phone и передавать их контроллеру. Есть идеи?
Комментарии:
1. Вы смотрели на это: Привязка модели к списку
Ответ №1:
Если вы просто продолжите и сделаете что-то подобное на ваш взгляд:
@using(Html.BeginForm... // I'm doing this from memory, check the arguments
{
for( int idx = 0; idx < Model.Phones.Count; idx )
{
@Html.EditorFor(m => m.Model.Phones[idx].Phone)
@Html.EditorFor(m => m.Model.Phones[idx].PhoneOperator)
}
// similar for cities, other model properties, etc.
}
и объявите свой метод post следующим образом
[HttpPost]
public ActionResult OnPostBack( <modeltype> arg )
{
if( ModelState.IsValid )
{
// action logic, etc.
тогда все должно быть хорошо. MVC определит результирующие текстовые поля таким образом, что сможет связать их обратно с моделью при обратной передаче. Я полагаю, что он объявляет атрибут name в текстовом поле, например, Phones_1_Phone. Вы можете проверить, просмотрев сгенерированный HTML-код в вашем браузере.
Кстати, есть и другие способы заставить это работать. Вы можете использовать ключи со словарем<>, а не со списком<>, и разреженные массивы тоже, я полагаю. И, конечно, вы захотите сделать что-то большее, чем просто сгенерировать кучу текстовых полей на своей странице — некоторые метки были бы хороши :).
Я обнаружил, что отличный учебник по этому и многому другому — Steven Sanderson Pro ASP.NET Фреймворк MVC 2, от Apress. Я начал с того, что ничего не знал о MVC всего пару месяцев назад, и теперь меня это вполне устраивает (хотя я еще не эксперт).
Упс, забыл упомянуть кое-что важное: в моем примере используется MVC3 и его механизм просмотра Razor. Вам нужно будет перевести ее в синтаксис MVC2, если вы не используете MVC3. Но вы должны взглянуть на MVC3, я нахожу его более интуитивным, чем его предшественники. Не говоря уже о менее «многословном».
Комментарии:
1. Спасибо, но я знаю об этом подходе. Проблема в том, что моя страница предназначена не для редактирования, а для создания. И я не знаю точно, сколько там будет текстовых полей. Например, у меня есть одно поле для phone, и если пользователь хочет добавить еще одно, он нажимает на кнопку «Добавить», и появляется еще одно поле.