4

我正在尝试解决 ASP.NET MVC 中缺少 CheckBoxList 的问题。我已经到了可以很好地呈现枚举值列表的地步,但是我一直坚持如何根据我的模型设置选中的属性——在这种情况下,它是一个用户实体,它有一个角色实体的 IList . 角色 id 对应于枚举值。

此示例使用 Spark 视图引擎语法,但它在功能上与标准 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

4 回答 4

9

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

[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>

于 2009-09-23T21:28:38.627 回答
3
<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>

PS 添加的语法是针对标准视图引擎的,可能无法编译,但思路应该很清楚。

于 2009-09-23T21:14:31.650 回答
2

检查与模型角色的相等性,并在相等时将检查设置为“已检查”,在不相等时设置为 string.Empty。

<label>
    <input type="checkbox"
           name="Roles"
           value="${(int)r}"
           ${ Model.Role == r ? "checked='checked'" : string.Empty } />
    ${r}
</label>
于 2009-09-23T21:18:25.950 回答
1

嘿,我实际上一直无法使上述方法起作用。将“checked”属性的值设置为空字符串仍会导致 IE 中的复选框被选中。我的解决方案是添加一个 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) %>
于 2009-11-10T21:10:50.220 回答