我正在努力解决ASP.NET MVC中缺少CheckBoxList的问题。我已经达到了可以渲染Enum值列表的程度,但我仍然坚持如何根据我的模型设置checked属性 - 在这种情况下,它是一个具有IList of Role实体的User实体。角色id对应于枚举值。
此示例使用Spark View Engine语法,但它在功能上与标准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>
答案 0 :(得分: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>
答案 1 :(得分: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>
P.S。添加的语法适用于标准视图引擎,可能无法编译,但想法应该清楚。
答案 2 :(得分:2)
检查与模型角色的相等性,并在相等时将check设置为“checked”,否则设置为string.Empty。
<label>
<input type="checkbox"
name="Roles"
value="${(int)r}"
${ Model.Role == r ? "checked='checked'" : string.Empty } />
${r}
</label>
答案 3 :(得分:1)
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) %>