ASP.NET MVC viewModel暴露Dictionary <t,k> property </t,k>的问题

时间:2009-12-29 17:15:07

标签: asp.net-mvc

我正在使用ASP.NET MVC,我正在尝试使用字典作为ViewModel中的属性,我希望在该视图中迭代视图并动态生成Dictionary中每个键值对的复选框。我可以成功地使用“值”属性的正确值生成复选框,但是我无法将选中的复选框传播回控制器。

这是viewmodel:

public class DocumentAddModel
{
    private DocumentViewModel _documentViewModel;
    private Dictionary<int, string> categoryCheckboxes = new Dictionary<int, string>();
    private Dictionary<int, string> roleCheckboxes = new Dictionary<int, string>();
    private Dictionary<int, string> fundCheckboxes = new Dictionary<int, string>();

    public DocumentViewModel DocumentViewModel
    {
        get { return _documentViewModel; }
        set { _documentViewModel = value; }
    }

    // the key of the dictionary (int) is the id of a Category object and
    // the value of the dictionary (string) is the friendly description name 
    // of the Category object
    public Dictionary<int, string> CategoryCheckboxes
    {
        get { return categoryCheckboxes; }
        set { categoryCheckboxes = value; }
    }

    public Dictionary<int, string> RoleCheckboxes
    {
        get { return roleCheckboxes; }
        set { roleCheckboxes = value; }
    }

    public Dictionary<int, string> FundCheckboxes
    {
        get { return fundCheckboxes; }
        set { fundCheckboxes = value; }
    }
}

以下是生成复选框的视图部分:

<% foreach (KeyValuePair<int, string> categoryCheckbox in Model.CategoryCheckboxes){%>
    <input type="checkbox" name= "CategoryCheckboxes" value="<%= categoryCheckbox.Key %>" />
    <%= categoryCheckbox.Value%>
    <% } %>

然而,当我提交表单时,即使我检查了某些类别,CategoryCheckboxes字典的计数也为零。 我做错了什么?

由于

P.S。我不想使用Html.Checkbox(因为我怀疑有人可能会建议),因为这样做起来同样棘手(我先尝试过)并且我真的不喜欢它产生隐藏字段的想法。

1 个答案:

答案 0 :(得分:2)

我不认为默认模型绑定器可以处理填充字典。通常我在这种情况下做的是在模型上有一个属性用于生成控件,另一个属性用于检索选定的值。我没有使用复选框,只是下拉列表,但原则是相同的。您将向模型添加CategoryCheckboxes数组(类型为int),并在发布表单时填充该数组。它将包含所选复选框的值。同样适用于其他类型的复选框。

 public int[] CategoryCheckboxes { get; set; }
 public int[] RoleCheckboxes { get; set; }
 public int[] FundCheckboxes { get; set; }

我可能会以不同方式命名它们(和相关的HTML输入),例如删除Checkboxes名字对象。