2012-05-16 50 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