提交具有相同名称的表单元素

dav*_*ave 10 asp.net-mvc

我有一个表单允许用户使用JQuery(使用.clone)创建额外的"行",以便他们可以决定需要提交多少相同的信息.我的问题是我无法弄清楚如何在我的控制器中访问这些表单项.

提交的表单可能如下所示

<input type="text" name="Amount" id="Amount">
   <select name="Item">
       <option value="1">Item 1"</option>
       <option value="2">Item 2"</option>
       <option value="3">Item 3"</option>
   </select>
<input type="text" name="Amount" id="Amount">
   <select name="Item">
       <option value="1">Item 1"</option>
       <option value="2">Item 2"</option>
       <option value="3">Item 3"</option>
   </select>
<input type="text" name="Amount" id="Amount">
   <select name="Item">
       <option value="1">Item 1"</option>
       <option value="2">Item 2"</option>
       <option value="3">Item 3"</option>
   </select>
Run Code Online (Sandbox Code Playgroud)

基本上,在input和选择之间的块可以重复无限次.当我提交给控制器时,我正在使用FormCollection form访问表单元素.从那里我不确定如何访问已提交的项目.我想过使用for循环,然后通过类似[[Amount]] [i]之类的东西来访问它们,但显然这不起作用.

我是否以正确的方式解决这个问题?如果有的话,是否有人对此如何运作有任何建议?

提前致谢.

Ako*_*acs 15

旧问题,但仍然......您可以通过调用Request.Form.GetValues或者将发布的值作为数组获取Request.QueryString.GetValues.例如:

string[] amounts = Request.Form.GetValues("Amount");
Run Code Online (Sandbox Code Playgroud)

并且amounts数组将包含正确的值,因此您可以发布包含comas,dots等的值,并且不用担心拆分/解析它.

当然,如果您正在运行MVC,请使用modelbinder来执行此操作.但是如果你使用webforms,通用处理程序等,你可以使用它...


veg*_*rby 9

查看模型绑定到列表.你的Action方法应该是:

public ActionResult MyAction(string[] Amount, int[] Item){
   // ...
}
Run Code Online (Sandbox Code Playgroud)

但是,这将使您需要"链接"项目.或者创建一个"Item"类:

public class Item {
    public string Amount { get; set; }
    public int Item { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

public ActionResult MyAction(IList<Item> items){
   // ...
}
Run Code Online (Sandbox Code Playgroud)

你的标记应该是:

<input type="hidden" name="items.Index" value="0" />
<input type="text" name="items[0].Amount" id="items[0].Amount">
   <select name="items[0].Item">
        <option value="1">Item 1"</option>
        <option value="2">Item 2"</option>
        <option value="3">Item 3"</option>
   </select>
<input type="hidden" name="items.Index" value="1" />
<input type="text" name="items[1].Amount" id="items[1].Amount">
   <select name="items[1].Item">
        <option value="1">Item 1"</option>
        <option value="2">Item 2"</option>
        <option value="3">Item 3"</option>
   </select>
Run Code Online (Sandbox Code Playgroud)

等等...


Spe*_*ort 6

我相信如果您有多个名为Amount的字段,则值将以逗号分隔.

要访问每个只是尝试:

string[] amounts = Request.Form["Amount"].Split(new char[] { ',' });
Run Code Online (Sandbox Code Playgroud)

但请记住,输入不会在提交时清除,因此如果有人在文本框中输入逗号,则会导致问题.

因此我建议给它们编号.


dav*_*ave 1

我最终意识到(脸红)JQuery 用于在克隆行中查找字符串(以替换)的机制基本上是正则表达式。因此我只需要转义方括号和句号。完成此操作后,我就可以按照 Phil Haack 博客的建议使用 JQuery 创建表单。

进入我的下一期......!