您好我在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可以将用户输入的数据绑定到映射到特定键的字典值?
答案 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