Asp.Net MVC过滤DropDownList ViewData

时间:2014-07-20 11:49:59

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

我正在学习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'

3 个答案:

答案 0 :(得分:0)

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

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;

在剃刀视图中,您必须创建<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>

答案 1 :(得分:0)

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

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 DbSet访问db.UserRoles表。

答案 2 :(得分:0)

您只需将数据库分配给选择列表中的&#34; user&#34; 即可。

像这样:

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

希望它有效。