1
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <div id="elem">
        <div class="fields">
            <select name="items[1][0]" id="items[1][0]">
            <option value="1">Book</option>
            <option value="2">Brush</option>
            </select>&nbsp;&nbsp;
            <input type="text" value="1" name="items[1][1]" id="items[1][1]">&nbsp;&nbsp;
            <a id="test" href="#">Remove Item</a>
        </div>
    </div>       
    </div><a href="#" id="addElem">Add Item</a></div>
    <br />
    <input type="submit" name="name" value="Submit" />
}

基本上,它有一组两个字段,一个名称字段和一个序列字段,但定义在一个二维数组中。该Add Item链接的工作方式是,当用户单击时,它会添加一组新的字段,其中 id 是var new_id = new Date().getTime();使用 JavaScript 的当前时间。例如,新的字段集将是:

<div class="fields">
<select name="items[1368034980308][0]" id="items[1368034980308][0]">
<option value="1">Book</option>
<option value="2">Brush</option>
</select>

<input type="text" name="items[1368034980308][1]" id="softwarePerAsset[1368034980308][1]">
</div>

我想将它们提交给编辑操作,其中编辑操作将通过items数组并添加两个字段。

我的编辑操作如下所示:

[HttpPost]
public ActionResult Edit(FormCollection col, string[,] items)
{
    return View();
}

我在这个动作上设置了一个断点,但items数组是空的,我只能通过FormCollection col变量访问字段。

是否有一些我items没有正确设置数组的东西。

4

1 回答 1

0

Json 来救援。我使用此博客(http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx)中的一个想法重新设计了表单,特别是非顺序部分我使用时间戳添加它们的索引:

<div class="fields">
 <input type="hidden" name="items.Index" value="1" />
 <select name="items[1].name" id="items[1].name">
  <option value="1">Visio</option>
  <option value="2">Painter</option>
 </select>&nbsp;&nbsp;
 <input type="text" name="items[1].serial" id="items[1].serial" />&nbsp;&nbsp;
 <a id="test" href="#">Remove Item</a>
</div>

然后在我的控制器中,我将 FormCollection 变量序列化为更容易操作的 json:

[HttpPost]
public ActionResult Edit(FormCollection col)
{
 string json = JSONHelper.ToJSON(col);
 return View();
}

字符串的示例json如下所示:

{ "btnSubmit" : "Submit",
  "items.Index" : "1,2,1368212161686,1368212162374,1368212162966,1368212163750",
  "items[1368212161686].name" : "1",
  "items[1368212161686].serial" : "",
  "items[1368212162374].name" : "2",
  "items[1368212162374].serial" : "",
  "items[1368212162966].name" : "1",
  "items[1368212162966].serial" : "98765",
  "items[1368212163750].name" : "2",
  "items[1368212163750].serial" : "43210",
  "items[1].name" : "1",
  "items[1].serial" : "12345",
  "items[2].name" : "2",
  "items[2].serial" : "67890"
}

我必须创建一个 ToJSON 扩展才能检索值,否则只检索名称

public static class JSONHelper
    {
        public static string ToJSON(this System.Web.Mvc.FormCollection collection)
        {
            var list = new Dictionary<string, string>();
            foreach (string key in collection.Keys)
            {
                list.Add(key, collection[key]);
            }
            return new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(list);
        }
    }
于 2013-05-10T19:16:03.237 回答