2012-05-16 88 views
2

你好我有在MVC 3項目具有字典特性如下定義的模型對象:ASP.Net MVC 3字典結合

MyObj.ObjDictionary<string,string> 

我有兩個控制器方法,其中一個手柄返回視圖和另一個處理視圖中的POST表單

public ActionResult Scanner(string val_1, string val_2, string val_3) 
{ 
//Fetch sessionObj from Model 
MyObj sessionObj = getSessionObj(val_1, val_2, val_3); 

//At this point model.ObjDictionary<string,string> contains data 
return View(sessionObj); 
} 

[HttpParamAction] 
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Scanner(MyObj model) 
{ 
    //At this point model.ObjDictionary<string,string> is null 
    //i.e. binding is not being properly achieved 

    //Validate POSTed data 
} 

在視圖中,我遍歷每個鍵 - 值對(kvp)。它必須這樣做,因爲屬性是動態的,我無法知道將會有多少字典值。

@using (Html.BeginForm("Action", "Home")) 
{ 
    @foreach (var kvp in Model.ObjDictionary) 
    { 
      <span>@Html.Label("Scan " + @kvp.Key)</span> 
      <span>@Html.TextBox(kvp.Key, "", new { @style = "font-size:Medium;width:400px;" })</span> 
    } 
    <input type="submit" name="Cancel" value="Cancel" /> 
    <input type="submit" id="Scanner" name="Scanner" value="Scanner" /> 
} 

目標是爲用戶提供一種輸入數據並將該數據綁定到特定鍵的值的方式。我的問題是,當Model.ObjDictionary被POST時,它是空的。我不確定我做錯了什麼,我讀了this文章,但是這是假設字典中已有的值。 ModelBinder是否可以將用戶輸入的數據綁定到映射到特定鍵的字典值?

回答

3

你所引用的文章回答你的問題,你只需要提供你的控件正確的名稱,請嘗試:


@using (Html.BeginForm("Action", "Home")) { 
    var i = 0; 
    foreach (var kvp in Model.ObjDictionary) 
    { 
     @Html.Hidden("ObjDictionary[" + i + "].Key", kvp.Key)@kvp.Key 
     <span>@Html.TextBox("ObjDictionary[" + i + "].Value", kvp.Value, new { @style = "font-size:Medium;width:400px;" })</span> 
     i++; 
     <br /> 
    } 

    <input type="submit" value="Submit" /> 
} 
0

對於字典,每個條目都應該有一個關鍵的一個領域,一個領域的值。

@using (Html.BeginForm("Action", "Home")) 
{ 
    var index = 0; 
    @foreach (var kvp in Model.ObjDictionary) 
    { 
     <span>@Html.Hidden("ObjDictionary[" + index + "].Key", kvp.Key) 
     <span>@Html.Label("Scan " + @kvp.Key)</span> 
     <span>@Html.TextBox("ObjDictionary[" + index + "].Value", kvp.Value, new { @style = "font-size:Medium;width:400px;" })</span> 
     index++; 
    } 
    <input type="submit" name="Cancel" value="Cancel" /> 
    <input type="submit" id="Scanner" name="Scanner" value="Scanner" /> 
} 

順便說一句,我在一個封裝HTML helper class此功能。你可以在這裏找到它和一個工作示範:https://github.com/ErikSchierboom/aspnetmvcdictionaryserialization