2

您好,我在 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
}

在视图中,我遍历每个键值对 (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 在发布时为空。我不确定我做错了什么,我阅读了这篇文章,但这假设字典中预先存在值。ModelBinder 有没有办法将用户输入的数据绑定到映射到特定键的字典值?

4

2 回答 2

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" />
}
于 2012-05-16T22:07:35.127 回答
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 帮助器类中。你可以在这里找到它和一个工作演示:https ://github.com/ErikSchierboom/aspnetmvcdictionaryserialization

于 2013-06-20T10:30:45.953 回答