asp.net mvc как я могу передать коллекцию контроллеру

#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, и если пользователь хочет добавить еще одно, он нажимает на кнопку «Добавить», и появляется еще одно поле.