Asp.net mvc 提交具有相同名称的表单元素

Asp.net mvc 提交具有相同名称的表单元素,asp.net-mvc,Asp.net Mvc,我有一个表单,允许用户使用JQuery(使用.clone)创建额外的“行”,这样他们就可以决定需要提交多少相同的信息。我的问题是,我无法确定如何在控制器中访问这些表单项 正在提交的表单可能如下所示 <input type="text" name="Amount" id="Amount"> <select name="Item"> <option value="1">Item 1"</option> <opti

我有一个表单,允许用户使用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>

项目1“
项目2“
项目3“
项目1“
项目2“
项目3“
项目1“
项目2“
项目3“
基本上,
input
和select之间的块可以重复无数次。当我提交给控制器时,我使用
FormCollection form
访问表单元素。从那里我不确定如何访问已提交的项。我想使用for循环,然后访问t通过类似于表单[“数量”][i]的方式进行折边,但显然这是行不通的

我这样做是正确的吗?如果是的话,有没有人对这项工作有什么建议


提前感谢。

我相信如果您有多个名为Amount的字段,那么这些值将以逗号分隔

要访问每一个,请尝试:

string[] amounts = Request.Form["Amount"].Split(new char[] { ',' });
但是请记住,提交时不会清除输入,因此如果有人在文本框中输入逗号,将导致问题


因此,我建议对它们进行编号。

我会将它们编号为Amount1、Amount2、Amount3等。

您可以将输入的id和name属性更改为类似于“Amount[1]、“Amount[2]、“Amount[3]”(是的,id和name属性可以包含特殊字符“[”或“])。然后在控制器中,编写http请求参数解析器以获取作为集合的金额。

签出。您的操作方法应为:

public ActionResult MyAction(string[] Amount, int[] Item){
   // ...
}
<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>
但是,这将使您需要“链接”项目。或者创建“项目”类:

public ActionResult MyAction(IList项){
// ...
}
您的标记应该是:

public ActionResult MyAction(string[] Amount, int[] Item){
   // ...
}
<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>

项目1“
项目2“
项目3“
项目1“
项目2“
项目3“
等等。

我最终意识到(blush)JQuery用于在克隆行中查找字符串(替换)的机制基本上是regex。因此,我只需要避开方括号和句点。一旦我这样做了,我就能够按照Phil Haack的博客建议使用JQuery创建表单

关于我的下一期…!

老问题,但仍然。。。 您可以通过调用
Request.Form.GetValues
Request.QueryString.GetValues
以数组的形式获取发布的值。例如:

string[] amounts = Request.Form.GetValues("Amount");
amounts
数组将包含正确的值,因此您可以发布包含comas、dots等内容的值,而不必担心拆分/解析它


当然,如果您正在运行MVC,请使用modelbinder。但是,如果您正在使用webforms、通用处理程序等,则可以使用此功能。

没错,访问它们正是我遇到的困难。啊,是的,您可以使用split方法。好吧,也许我找错了地方,我需要找出如何更改克隆的对象包含[]个字符的rm属性!一旦它们位于amounts数组中,您就可以使用for循环对它们进行迭代,如:for(int i=0;唯一真正的问题是有人在表单字段中添加逗号,我可以通过验证来处理。您认为以我目前的方式这样做是可行的,还是建议尝试让它工作以便我对表单项进行编号?问题是JQuery似乎不喜欢重命名克隆的表单属性当包含[]个字符时。现有表单元素已克隆,但属性id和名称未更改。否则,我将使用此技术。感谢jscoot,与Adam的答案留下的注释相同。感谢您的回复,我确实在Spencer的答案中对此做了注释。这归结为JQuery不喜欢[]在属性id和名称字段中,所以当我去更改它们时,JQuery不会这样做。也许我应该发布关于JQuery的信息,因为这是一种更好的方法。永远不要使用相同的
id=“…”
属性创建元素。
id
的概念是独一无二的。