2008-10-21 4 views
4

Предположим, вы создали форму с использованием ASP.NET MVC, которая имеет динамическое число элементов формы.Как вы обрабатываете вывод динамически сгенерированной формы в ASP.NET MVC?

Например, для каждого продукта требуется флажок, а количество товаров меняется с каждым днем.

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

ответ

5

Просто дайте каждому CheckBox уникальное значение имени:

<input class="approveCheck" id="<%= "approveCheck" + recordId %>" 
name="<%= "approveCheck" + recordId %>" type="checkbox" /> 

Затем разобрать список значений формы в действии, после того, как представить:

foreach (var key in Request.Form.Keys) 
    { 
     string keyString = key.ToString(); 
     if (keyString.StartsWith("approveCheck", StringComparison.OrdinalIgnoreCase)) 
     { 
      string recNum = keyString.Substring(12, keyString.Length - 12); 

      string approvedKey = Request.Form["approveCheck" + recNum]; 
      bool approved = !String.IsNullOrEmpty(approvedKey); 
      // ... 

Вам не нужно передать значения формы как аргументы; вы можете просто получить их из Request.Form.

Еще один вариант: напишите связующее устройство для изменения списка в пользовательский тип отправки формы.

0

В зависимости от ваших данных вы можете либо вывести «CheckboxList» (который больше невозможен в более новых версиях), так и использовать параметр string[], или вы можете настроить несколько форм и просто изменить действие.

2

Per Craig ответ ... это безопасно. Есть причуды для размещения нескольких элементов формы с тем же именем. Я бы добавил, что было бы разумно обернуть логику, которая делает «коллекцию» элементов управления аналогично WebForms. Web Forms добавляет имя элемента управления контейнером и добавляет индекс. Например, в Repeater элементы формы внутри были бы названы (что-то вроде) RepeaterName_Element1, RepeaterName_Element2. Когда вы идете, чтобы получить элементы, вы должны использовать FindControl или что-то в этом роде.

2

В зависимости от вяжущего, которые вы используете, это должно работать:

<%var i = 0; 
    foreach (var product (IList<ProductSelection>)ViewData["products"]) {%> 
     <%=Html.Hidden(string.Format("products[{0}].Id", i), product.Id)%> 
     <%=Html.Checkbox(string.Format("products[{0}].Selected", i))%> 
     <%=product.Name%><br/> 
<%}%> 

... что приведет к HTML-то вроде этого (обратите внимание на обозначение массива на имена):

<input name="products[0].Id" type="hidden" value="123"> 
<input name="products[0].Selected" type="checkbox"> 
Widget 
<input name="products[1].Id" type="hidden" value="987"> 
<input name="products[1].Selected" type="checkbox"> 
Gadget 

... и способ управления, который обрабатывает сообщение:

public ActionResult SelectProducts(IList<ProductSelection> products) 
{ 
    ... 
} 

После связывания, продукты PARAMET er будет содержать два экземпляра ProductSelection.

Одно из предостережений заключается в том, что я не использовал новую привязку по умолчанию для сложных объектов. Скорее я использую либо NameValueDeserializer, либо CastleBind, как из MvcContrib. Они оба ведут себя так. Я предполагаю, что привязка к бета-версии будет работать одинаково.

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