复选框MVC - 组 - 用户

时间:2015-09-11 07:35:09

标签: c# asp.net-mvc checkbox

我有表用户和角色的数据库,我需要显示所有角色的视图,并检查用户拥有的角色。我已经有方法向我展示了所有可用角色和方法,向我展示了用户拥有的角色,但我真的不知道如何在视图中实现,如何实际检查这些复选框。非常感谢您的帮助

表格角色

[![在此处输入图像说明] [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)
}

2 个答案:

答案 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个表格UsersRolesUserRoles这是UsersRoles之间的多对多关系,并包含字段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()