Asp.net mvc 如何在ASP.NET MVC中处理动态生成表单的输出?

Asp.net mvc 如何在ASP.NET MVC中处理动态生成表单的输出?,asp.net-mvc,forms,post,Asp.net Mvc,Forms,Post,假设您使用ASP.NET MVC创建一个具有动态表单元素数的表单 例如,每个产品都需要一个复选框,并且产品的数量每天都在变化 您将如何处理被发回控制器的表单数据?您无法在操作方法上设置参数,因为您不知道将返回多少表单值。根据您的数据,您可以输出一个“复选框列表”(在较新版本中不再可能),然后使用一个字符串[]参数,或者,您可以设置多个表单,只需修改操作。只需为每个复选框指定一个唯一的名称值: <input class="approveCheck" id="<%= "approveCh

假设您使用ASP.NET MVC创建一个具有动态表单元素数的表单

例如,每个产品都需要一个复选框,并且产品的数量每天都在变化


您将如何处理被发回控制器的表单数据?您无法在操作方法上设置参数,因为您不知道将返回多少表单值。

根据您的数据,您可以输出一个“复选框列表”(在较新版本中不再可能),然后使用一个
字符串[]
参数,或者,您可以设置多个表单,只需修改操作。

只需为每个复选框指定一个唯一的名称值:

<input class="approveCheck" id="<%= "approveCheck" + recordId %>" 
 name="<%= "approveCheck" + recordId %>" type="checkbox" />
您不需要将表单值作为参数传递;您可以从Request.Form获取它们


另一种选择:编写一个模型活页夹,将列表更改为自定义类型,以便提交表单。

根据Craig的回答。。这样更安全。发布具有相同名称的多个表单元素有一些怪癖。我想补充一点,明智的做法是以类似于WebForms的方式包装控件“集合”的逻辑。Web表单在容器控件的名称前加上前缀并添加索引。例如,在Repeater中,内部的表单元素将命名为(类似于)RepeaterName_Element1、RepeaterName_Element2。当您要取出元素时,必须使用FindControl或类似的工具。

根据您使用的活页夹,这应该可以:

<%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(注意名称上的数组表示法):


小装置
小工具
…以及处理post的控制器方法:

public ActionResult SelectProducts(IList<ProductSelection> products)
{
     ...
}
公共行动结果选择产品(IList产品)
{
...
}
绑定后,products参数将包含ProductSelection的两个实例

一个警告是,我没有对复杂对象使用新的默认绑定。相反,我使用的是来自MvcContrib的NameValueDeserializer或CastleBind。他们都这样做。我猜Beta版的绑定也会以同样的方式工作

<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)
{
     ...
}