2013-05-08 52 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); 
     } 
    }