ASP.Net MVC 3字典绑定

时间:2012-05-16 21:02:11

标签: asp.net-mvc asp.net-mvc-3

您好我在MVC 3项目中定义了一个模型对象,该项目具有Dictionary属性,如下所示:

MyObj.ObjDictionary<string,string>

我有两个控制器方法,一个处理返回视图,另一个处理视图中的POSTed表单

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
}

在View中,我遍历每个键值对(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时为null。我不确定我做错了什么,我读过this文章,但这假定字典中存在预先存在的值。有没有一种方法,ModelBinder可以将用户输入的数据绑定到映射到特定键的字典值?

2 个答案:

答案 0 :(得分: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" />
}

答案 1 :(得分: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