根据用户的角色筛选选择列表



将用户分配给某个项目时,我想将可用用户列表限制为具有"项目经理"角色的人员。我可以在语法方面使用一些帮助,因为我似乎无法为 Where 方法获得正确的 LINQ 语法。

创建操作 (获取(

// This is the unfiltered version
ViewBag.AssignedToId = new SelectList(db.Users, "Id", "FullName");
// Attempt to filter   
ViewBag.AssignedToId= new SelectList(db.Users.Where(c => c.Roles.Contains("Project Manager")), "Id", "FullName");

创建视图

<div class="form-group">
     @Html.LabelFor(model => model.AssignedToId, "Choose a Project Manager", htmlAttributes: new { @class = "control-label col-md-2" })
         <div class="col-md-10">
             @Html.DropDownList("AssignedToId", null, htmlAttributes: new { @class = "form-control" })
             @Html.ValidationMessageFor(model => model.AssignedToId, "", new { @class = "text-danger" })
         </div>
</div>

我在下拉列表中收到错误,说

无法比较类型为"System.Collections.Generic.ICollection"的元素。仅支持基元类型、枚举类型和实体类型。

假设这是您正在使用的实体框架,您会注意到 db。用户的类型是 DbSet,而 db。Users.Where(...( 的类型为 IQueryable。我应该想象,如果你添加.ToList((,如下所示:

ViewBag.AssignedToId= new SelectList(db.Users.Where(c => c.Roles.Contains("Project Manager")).ToList(), "Id", "FullName");

如果Roles是一个集合,那么我建议在 LINQ to Entities 查询之外创建"Project Manager"列表。 此外,创建一个const string变量来保存"Project Manager"魔术字符串。 这将使您不必在使用该字符串的每个位置更改该字符串(如果该字符串要更改(。

public const string roleProjectManager = "Project Manager";
var lstProjectManagers = db.Users.Where(x => x.Roles.Contains(roleProjectManager)).ToList();

然后创建您的选择列表。

ViewBag.AssignedToId= new SelectList(lstProjectManagers, "Id", "FullName");

让我知道这是否有帮助!

我的问题的解决方案是在控制器创建操作 (GET( 中包含以下代码:

var role = db.Roles.SingleOrDefault(u => u.Name == "Project Manager");
var usersInRole = db.Users.Where(u => u.Roles.Any(r => (r.RoleId == role.Id)));
ViewBag.AssignedId = new SelectList(usersInRole, "Id", "FullName");

而不是:

ViewBag.AssignedToId = new SelectList(db.Users, "Id", "FullName");

然后将其包含在创建视图中:

<div class="form-group">
      @Html.LabelFor(model => model.AssignedToId, "Choose a Project Manager", htmlAttributes: new { @class = "control-label col-md-2" })
      <div class="col-md-10">
           @Html.DropDownListFor(Model => Model.AssignedToId, ViewBag.AssignedId as SelectList, null, htmlAttributes: new { @class = "form-control" })
           @Html.ValidationMessageFor(model => model.AssignedToId, "", new { @class = "text-danger" })
      </div>
</div>

替换此下拉列表列表:

@Html.DropDownList("AssignedToId", null, htmlAttributes: new { @class = "form-control" })

最新更新