2012-03-09 3 views
7

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

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

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

Благодаря

+0

вы пытались с помощью AJAX –

+0

@COLDTOLD это проблема на стороне сервера, Ajax не является решением, которое будет иметь какое-либо влияние –

+0

@Marek Karbarz вы можете обновить частичную часть страницы путем добавления новых элементов с помощью AJAX –

ответ

2

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

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

EDIT: Вы все еще можете получить доступ к коллекции форм в более сыром способе из жгутов контроллеров с использованием

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 в mock Views, чтобы гарантировать, что префикс подходит для анализа MVC, но я не буду вдаваться в это здесь.

+0

Проблема заключается в том , DropDowns являются динамичными и не знают, что будет показано DropDowns! Один вопрос, однако, в случае, если я задал в качестве входных данных Action a ViewModel без DropDowns, есть ли способ получить доступ к FormsCollection внутри тела метода Action? – Bill

8

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

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

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

Смежные вопросы