代码之家  ›  专栏  ›  技术社区  ›  Michael Cook

在ASP.NET MVC中设置复选框的选中属性

  •  4
  • Michael Cook  · 技术社区  · 16 年前

    我正在努力解决ASP.NET MVC中缺少复选框列表的问题。我已经到了可以很好地呈现枚举值列表的地步,但是我一直在研究如何基于我的模型设置选中的属性——在本例中,这个模型是一个拥有IList角色实体的用户实体。角色ID对应于枚举值。

    此示例使用Spark View引擎语法,但其功能与标准ASP.NET MVC视图引擎相同(“$”(与“<%=”或“<%”)相同)

    <for each="var r in Enum.GetValues(typeof(UserRole))">
        <label><input type="checkbox" name="Roles" value="${(int)r}" checked="[How-The-Heck-To-I-Get-This?]" />${r}</label>
    </for>
    
    4 回复  |  直到 11 年前
        1
  •  9
  •   Rohan West    16 年前

    如果您的角色是这样定义的,那么您可以将多个角色与用户关联起来。

    [Flags]
    public enum UserRole
    {        
        DataReader = 1,
        ProjectManager = 2,
        Admin = 4,
    }
    

    通过添加简单的扩展方法,可以检查角色是否包含目标角色

    public static class RoleExtension
    {
        public static bool HasRole(this UserRole targetVal, UserRole checkVal)
        {
            return ((targetVal & checkVal) == checkVal);
        }
    }
    

    使用视图中的扩展方法更新复选框,不确定以下方法是否适用于视图引擎。

    <for each="var r in Enum.GetValues(typeof(UserRole))">
    <label>
        <input 
           type="checkbox"
           name="Roles" 
           value="${(int)r}" 
           checked="${Model.Role.HasRole(r) ? "checked" : string.Empty}" />
    </label>
    

        2
  •  3
  •   user151323    16 年前
    <for each="var r in Enum.GetValues(typeof(UserRole))">
        <label>
          <% if (r.Checked) { %>
            <input type="checkbox" checked="checked" />${r}
          <% } else { %>
            <input type="checkbox" />${r}
          <% } %>
        </label>
    </for>
    

    另外,添加的语法是针对标准视图引擎的,可能不会编译,但其思想应该是清晰的。

        3
  •  2
  •   tvanfosson    11 年前

    使用模型角色检查相等性,当相等时设置为“选中”,当不相等时设置为“空”。

    <label>
        <input type="checkbox"
               name="Roles"
               value="${(int)r}"
               ${ Model.Role == r ? "checked='checked'" : string.Empty } />
        ${r}
    </label>
    
        4
  •  1
  •   Amit    16 年前

    嘿,我实际上还没能让上述方法发挥作用。将“checked”属性的值设置为空字符串仍会导致IE中的checked复选框。我的解决方案是添加一个htmlhelper扩展:

    public static string SimpleCheckbox(this HtmlHelper helper, 
                                        string name, 
                                        string value, 
                                        bool isChecked)
    {
        return String.Format("<input type=\"checkbox\" name=\"{0}\" value=\"{1}\" " + (isChecked ? "checked" : "") + "/>", name, value);
    }
    

    在标记中:

    <%= Html.SimpleCheckbox("checkboxId", item.Id, item.IsSelected) %>