我有表用户和角色的数据库,我需要显示所有角色的视图,并检查用户拥有的角色。我已经有方法向我展示了所有可用角色和方法,向我展示了用户拥有的角色,但我真的不知道如何在视图中实现,如何实际检查这些复选框。非常感谢您的帮助
表格角色
[![在此处输入图像说明] [1]] [1]
所有可用角色的方法
[![在此处输入图像说明] [2]] [2]
选定角色的方法
[![在此处输入图像说明] [3]] [3]
模型
public class UserRoleModel
{
public int ID { get; set; }
public int? UserID { get; set; }
public UserRoleModel()
{
ListRole = new List<RoleVM>();
}
public string Name { get; set; }
public List<RoleVM> ListRole { get; set; }
public List<RoleVM> UserRole { get; set; }
}
public class RoleVM
{
public int ID { get; set; }
public string Name { get; set; }
public bool IsSelected { get; set; }
}
使用复选框查看
@for(int i = 0; i < Model.ListRole.Count; i++)
{
@Html.HiddenFor(m => m.ListRole[i].ID)
@Html.CheckBoxFor(m => m.ListRole[i].IsSelected, new { @checked = "checked" });
@Html.LabelFor(m => m.ListRole[i].IsSelected, Model.ListRole[i].Name)
}
答案 0 :(得分:0)
你试过MVCCheckboxList吗?如果你可以使用这个库,看起来像这样:
@Html.CheckBoxListFor(m => //string array that is bound to your model, will have selected options on POST
m => //SelectList of all available items
m => m.Value,
m => m.Text,
m => //collection of SelectListItem for all selected items,
MvcCheckBoxList.Model.Position.Vertical,
x => new { @class = "editor-cbl" })
答案 1 :(得分:0)
首先,您在前面的问题中已经注意到数据库结构不正确。要正确表示您需要3个表格Users
,Roles
和UserRoles
这是Users
和Roles
之间的多对多关系,并包含字段for UserID
(FK to Users
table)和RoleID
(FK to Roles
table)。
您已表示您不准备更改此内容(意味着您甚至无法添加新角色,无法更改现有角色的名称等),但至少您需要对所有可用角色进行一些表示。使用Distinct()
查询现有角色无法正常工作,因为最初数据库将为空。而且您的模型不需要2个RoleVM
集合(您唯一的编辑集)。
您需要首先根据所有角色创建RoleVM
集合,然后根据用户的当前角色设置IsSelected
属性。
您的GET方法需要类似
public ActionResult Edit(int ID)
{
// Get all roles
IEnumerable<string> roles = new List<string>(){ "Administrator", "Gestor", "Supervisor", "SecurityManager", "Admin" };
// Get the User
User user = db.Users().Where(u => u.ID == ID).FirstOrDefault();
// Get the user roles (if not included in User model
IEnumerable<UserRole> userRoles = db.UserRoles().Where(r => r.UserID == ID);
// Create collection of all roles
List<RoleVM> allRoles = roles.Select(r => new RoleVM()
{
Name = r
}).ToList();
// Set the ID and IsSelected properties based on the user roles
foreach(RoleVM role in allRoles)
{
UserRole userRole = userRoles.FirstOrDefault(r => r.Role == role.Name);
if (userRole != null)
{
role.ID = userRole.ID;
role.IsSelected = true;
}
}
// Initialize the view model
UserVM model = new UserVM()
{
ID = user.ID,
Name = user.Name,
Roles = allRoles
};
return View(model);
}
并在视图中,从new { @checked = "checked" }
方法
CheckBoxFor()