5

我有一个包含字典的ViewModel类(以及与此问题无关的其他内容):

public class MyViewModel {
    public Dictionary<int, string> Data { get; set; }
    /* ... */
}

然后我有几个处理字典的GET/动作。POSTGET操作将首先Dictionary<int, string>使用数据库中的一些数据填充 ,然后返回View

  • .Keys 将在隐藏字段上;和
  • .Values 将在文本区域上供用户编辑。

然后,用户将提交此表单,调用该POST操作。它将尝试处理输入(过程无关紧要)。Key/Value对有些是有效的,有些是无效的。

如果存在无效对,则该POST操作将重建ViewModel,但这次字典应仅包含无效对,并将重新显示相同的视图以供用户修复并再次尝试提交。

问题:实现这一目标的最简单和最干净的方法是什么?

到目前为止,我在控制器中拥有的(工作正常):

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 命名我的字段。但我还必须遍历 Dictionary 以提取键/值对,因此它不能是for (var i = 0; i < Model.Data.Count; i++) {...}循环。

4

1 回答 1

1

该解决方案在本文中描述 - ASP.NET MVC2 和 MVC3 中的字典模型绑定器

该代码是通用的,也可以与 MVC 1 一起使用。

于 2011-03-04T12:38:45.553 回答