I'm trying to work around the lack of a CheckBoxList in ASP.NET MVC. I've gotten to the point I can render a list of Enum values just fine, but I'm stuck on how to set the checked attribute based on my Model - Which in this case is a User entity that has an IList of Role entities. The role id's correspond to the enum values.
This example is using the Spark View Engine syntax, but it's functionally identical to the standard ASP.NET MVC view engine ("$(" is the same as "<%=" or "<%")
<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>
If your roles are defined like this then you can associate more than one role with the user
[Flags]
public enum UserRole
{
DataReader = 1,
ProjectManager = 2,
Admin = 4,
}
By adding a simple extension method you can check if you role contains a target role
public static class RoleExtension
{
public static bool HasRole(this UserRole targetVal, UserRole checkVal)
{
return ((targetVal & checkVal) == checkVal);
}
}
Use the extension method in you view to update the check box, not sure if the following is the correct way for your view engine.
<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>