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

时间:2009-01-13 04:29:30

标签: 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>

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

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

提前致谢。

6 个答案:

答案 0 :(得分:15)

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

string[] amounts = Request.Form.GetValues("Amount");

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

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

答案 1 :(得分:9)

结帐Model Binding To A List。你的Action方法应该是:

public ActionResult MyAction(string[] Amount, int[] Item){
   // ...
}

然而,这将使您需要“链接”项目。或者创建一个“Item”类:

public class Item {
    public string Amount { get; set; }
    public int Item { get; set; }
}

public ActionResult MyAction(IList<Item> items){
   // ...
}

你的标记应该是:

<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>

等等...

答案 2 :(得分:6)

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

要访问每一个,请尝试:

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

请注意,输入在提交时不会被清除,因此如果有人在文本框中输入逗号,则会导致问题。

因此我建议给它们编号。

答案 3 :(得分:1)

我最终意识到( blush )JQuery用来查找克隆行(要替换)中的字符串的机制基本上是正则表达式。因此,我只需要摆脱方括号和句号。一旦我这样做,我就可以使用JQuery创建表格,就像Phil Haack的博客所说的那样。

到我的下一期......!

答案 4 :(得分:0)

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

答案 5 :(得分:0)

您可以将输入的id和name属性更改为“Amount [1]”,“Amount [2]”,“Amount [3]”(是的,id和name属性可以包含特殊值)字符“[”或“]”)。然后在控制器中编写一个http请求参数解析器以将Amounts作为集合返回。