【问题标题】:Asp.Net MVC Filtering DropDownList ViewDataAsp.Net MVC 过滤 DropDownList ViewData
【发布时间】:2015-08-02 08:41:12
【问题描述】:

我正在学习 Asp.Net MVC。我在处理下拉列表时遇到了一个小问题。

我不想列出具有管理员角色的用户

public ActionResult Create()
    {
        var user = db.Users.Where(u => u.Roles.Where(r => r.RoleId != "1"));
        ViewBag.UserId = new SelectList(user, "Id", "UserName");
        return View();
    }

我收到此错误

错误 2 无法将 lambda 表达式转换为委托类型“System.Func”,因为块中的某些返回类型不能隐式转换为委托返回类型

错误 1 ​​无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“bool”

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-5


    【解决方案1】:

    首先,您应该过滤查询以仅获取非管理员用户:

    var user = db.Users.Where(user => user.Role.Name != "Admin").ToList();
    

    您必须像这样在控制器中创建List<SelectListItem>

    dropdownItems.AddRange(new[]
    {
         new SelectListItem() {Text = "User1", Value = "1", Selected = true },
         new SelectListItem() {Text = "User2", Value = "2", Selected = false },
         new SelectListItem() {Text = "User3", Value = "3", Selected = false }
    });
    
    ViewBag.DropDownItems = dropdownItems;
    

    在 razor 视图中,您必须像这样创建 <select> 标签:

    <select name="Users" id="Users">
          @foreach (var selectListItem in ViewBag.DropDownItems as List<SelectListItem>)
          {
              <option value="@selectListItem.Value" selected="@selectListItem.Selected">@selectListItem.Text</option>
          }
    </select>
    

    【讨论】:

    • 我认为你误解了问题,问题不是这个
    • 这与问题无关
    【解决方案2】:

    您可以直接加载所有非管理员用户,避免过滤代码中的数据。

    public ActionResult Create() {
       // Get the Id for the "Admin" role
       int AdminRoleID = db.Roles.First(r => r.Name == "Admin").Id;
    
       // Get the users that don't have the role "Admin"
       var user = db.Users.Where(u => db.UserRoles.Where(r => r.roleId != AdminRoleID).Select(r => r.UserId).Contains(u.Id));
    
       ViewBag.UserId = new SelectList(user, "Id", "UserName");
       return View();
    }
    

    注意:假设UserRoles 表被db.UserRoles DbSet 访问。

    【讨论】:

    • 我无法理解 Select(r => r.Id).Contains(u.Id) 部分,r.Id 是角色 id,u.Id 是用户 id
    • 你是对的,那是我的打字错误,我更新了我的答案
    • 那么问题是 r 不包含 UserId,我们可能会通过 r.Users.Where(p=>p.UserId) 找到它,但如果我这样做会出错。
    • 你能给我们UsersRoles表的字段吗?
    • 这是asp.net身份表Users包含userid,roles包含rolename和roleid,userroles包含userid和roleid。
    【解决方案3】:

    您可以在选择列表中将数据库分配给 "user"

    像这样:

     ViewBag.UserId = new SelectList(db.Users.Where(u => u.Roles.Where(r => r.RoleId != "1")), "Id", "UserName");
    

    希望它有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多