Публикация динамических форм в ASP.NET MVC 3 - PullRequest
6 голосов
/ 09 марта 2012

В одной из форм, над которыми я работаю, если пользователь выбирает DropDownList «Тип» на основе выбранного значения, я бы динамически отображал набор других DropDownLists.

Например, Типы: АвтомобильКвартира, выбрав «Автомобиль», будет динамически добавлять два новых DropDownLists «Цена» и «Модель».При выборе «Строительство» динамически добавляются два новых DropDownLists «Площадь» и «Этаж»

Мой вопрос заключается в том, как обрабатывать опубликованные данные на сервере?Обычно я получаю поля формы, и они автоматически получают «привязку к модели».Но как насчет тех динамических полей, которые были добавлены на странице на основе выбора пользователя?Как я получу их внутри Акции?

Спасибо

Ответы [ 2 ]

8 голосов
/ 09 марта 2012

Вы можете использовать FormCollection для доступа ко всем полям на странице.Однако вы потеряете автоматическое связывание модели и должны будете перебирать коллекцию форм, чтобы найти ваши значения следующим образом:

public ActionResult ActionMethod(FormCollection formCollection)
{
    foreach (var key in formCollection.AllKeys)
    {
        var value = formCollection[key];
    }
}

Конечно, вы также можете просто включить динамические выпадающие списки в вашу модель.

2 голосов
/ 09 марта 2012

Ах, неправильно понял.

Если вы знаете, какие выпадающие списки потенциально могут быть добавлены, я всегда буду иметь значение для вашей модели. MVC установит их как значение по умолчанию, если ничего не получено.

РЕДАКТИРОВАТЬ: вы по-прежнему можете получить доступ к коллекции форм более простым способом без использования контроллеров с помощью

Request.Form.Keys
Request.QueryString.Keys

Request["ExpectedDropdownName"]

Конечно, это будут все значения, опубликованные в вашей форме, поэтому вам понадобится способ распознать одно из ваших выпадающих меню, например префикс или что-то в этом роде. Например

   foreach (var key in Request.Form.AllKeys.Where(k => k.StartsWith("dynamic-dropdown-"))
   {
       var selectedValue = Request[key];
   }

Я все еще не совсем понимаю, как вы собираетесь обрабатывать динамические выпадающие списки, если вы не знаете, какими они будут, и это может вызвать некоторые проблемы и сделает проверку полностью динамичной и на стороне клиента (не на 100% безопасной). Это также может представлять некоторые проблемы безопасности, но есть некоторые sceanarios, где вы можете использовать это, и я предполагаю, что у вас есть один из них.

Если это не так, не забывайте, что только из-за того, что у модели есть свойство, ее вообще не нужно публиковать.

Вы можете сделать:

public class MyModel
{
    [Required]
    public string FirstName { get; set; }

    public string PossibleDropdown1 { get; set; }

    public string PossibleDropdown2 { get; set; }
}

Контроллер сделает все возможное, чтобы заполнить модель, но если вы не передадите некоторые поля обратно из формы, они просто будут нулевыми, и действие все равно будет работать.

Я также реализовал гораздо более сложные сценарии, подобные этому, используя объекты, которые являются дочерними по отношению к родительской модели и могут иметь все значения NULL. Для этого нужно немного поработать над вызовами ajax для EditorTemplates в фиктивных представлениях, чтобы убедиться, что префикс правильно подходит для анализа MVC, но я не буду вдаваться в подробности.

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