【问题标题】:How do I bind a dictionary to a set of checkboxes using ASP.NET MVC?如何使用 ASP.NET MVC 将字典绑定到一组复选框?
【发布时间】:2009-06-07 16:09:10
【问题描述】:

我需要'绑定'

Dictionary<MyType, bool> 

到 asp.net mvc 中的复选框列表。

我对如何做到这一点感到困惑。谁能帮帮我?

【问题讨论】:

    标签: asp.net-mvc binding dictionary checkboxlist


    【解决方案1】:

    假设 MyType 有一个名为 Name 的字符串属性,您将从中获取复选框的名称。请注意,我已将其更改为以MyType 开头,以便我们可以在服务器上轻松区分它。如果您有其他方法可以确定哪些字段是复选框,则可能不需要此步骤。

    <% foreach (var pair in model.ChecboxDictionary) { %>
       <%= Html.CheckBox( "MyType." + pair.Key.Name, pair.Value ) %>
    <% } %>
    

    控制器(这使用 FormParameters,但您也可以尝试将带有前缀“MyType”的模型直接绑定到Dictionary&lt;string,bool&gt;,然后进行翻译。

    public ActionResult MyAction( FormParameters form )
    {
        var dict = ... fill dictionary with original values...
        foreach (var key in dict.Keys)
        {
            if (!form.Keys.Contains( "MyType." + key.Name ))
            {
                dict[key] = false;
            }
        }
    
        foreach (var key in form.Keys.Where( k => k.StartsWith("MyType.")))
        {
            var value = form[key].Contains("on"); // just to be safe
            // create or retrieve the MyType object that goes with the key
            var myType = dict.Keys.Where( k => k.Name == key ).Single();
    
            dict[myType] = value;
        }
    
        ...
    }
    

    您还可以在客户端使用一些 javascript,在提交之前为每个“未选中”复选框添加 name=off 参数,这样就无需填写原始字典,因为您将能够直接派生所有字典元素的值。

    【讨论】:

    • 到目前为止我也知道。现在我需要将该数据(具有更改的布尔值)传递回控制器。你的方法是否适用,我只是做错了什么,或者它不包括那部分?
    • 这就是问题 - 如何使模型绑定起作用。抱歉我的含糊不清。
    • 看起来我不会逃避创建自定义模型绑定器。
    • Dictionary 无论如何都会要求从存储库重新填充数据以填充 TEntity。 MyType 可以有很多道具。但是为每个字典条目表单->服务器绑定调用数据库是不可接受的。我想我需要看看别的地方。
    猜你喜欢
    • 2011-07-08
    • 2018-12-10
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    相关资源
    最近更新 更多