我试图解决缺乏在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>
如果您的角色是这样定义的,那么你可以关联与用户的多个角色
[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>
<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添加的语法是标准的视图引擎,可能无法编译,但思路应该是清楚的。
请与检查模型以及一套平等“检查”相等时和时的String.Empty不是。
<label>
<input type="checkbox"
name="Roles"
value="${(int)r}"
${ Model.Role == r ? "checked='checked'" : string.Empty } />
${r}
</label>
嘿嘿,我其实一直没能得到上述方法的工作。 一个“选中”属性的值设置为空字符串仍然导致在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) %>