我有一个 ViewModel 类,其中包含一个字典(以及此问题的其他不相关内容):
public class MyViewModel {
public Dictionary<int, string> Data { get; set; }
/* ... */
}
然后我有几个GET
/ POST
个动作来处理字典。 GET
操作首先会在Dictionary<int, string>
中填入数据库中的一些数据,然后返回View
:
.Key
将位于隐藏字段;和.Value
将位于 textareas 上供用户编辑。然后,用户将提交此表单,并调用POST
操作。它将尝试处理输入(该过程无关紧要)。部分Key
/ Value
对有效,有些无效。
如果存在无效对,则POST
操作将重建 ViewModel ,但这次字典应仅包含无效对,并且重新显示相同的视图供用户修复并再次尝试提交。
问题:什么是最简单的&amp;最清洁的方法来实现这个目标?
到目前为止(工作正常),在控制器中:
public ActionResult MyAction(MyViewModel vm) {
/* Process data */
if (are there invalid pairs?) {
var vmErrors = new MyViewModel();
/* ... fill the ViewModel ... */
vmErrors.Data =
vm.Data
.Where(x => IsInvalid(x))
.ToDictionary(x => x.Key, x => x.Value);
return View(vmErrors);
}
}
观点:
<% var i = 0; foreach (var p in Model.Data) { %>
<%= Html.Hidden("vm.Data[" + i + "].key", vm.Key %>
<%= Html.TextArea("vm.Data[" + i + "].value", vm.Value %>
<% i++; } %>
问题在于取悦模型绑定器我必须使用顺序ID在视图上命名我的字段。但我还必须迭代字典以提取键/值对,因此它不能是for (var i = 0; i < Model.Data.Count; i++) {...}
循环。
答案 0 :(得分:1)
本文介绍了解决方案 - Dictionary Model Binder in ASP.NET MVC2 and MVC3
代码是通用的,也可以与MVC 1一起使用。