2013-05-08 54 views
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链接的工作原理是,当用户点击时,它将使用JavaScript添加一组新的字段,其ID为当前时间var new_id = new Date().getTime();。因此,例如,一组新的领域将是:c#表单元素的数组

<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阵列没有被正确设置。

+0

如果否决,请做护理和评论为什么。谢谢。 – mpora 2013-05-08 17:56:40

+0

是我第一次看到这个。通常要在表单中获取数组,只需要在数组名称和输入后添加一个空[]。我认为你最好的选择是使用jQuery与数组构建一个JSON,并在后期发送JSON。 – 2013-05-10 19:09:44

+1

是的,这是我最终做的。我的解决方案发布如下。 – mpora 2013-05-10 19:16:36

回答

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" : "", 
    "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); 
     } 
    }