Asp.Net MVC过滤下拉列表ViewData



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

我不想列出具有Admin角色的用户

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 '。因为块中的一些返回类型不能隐式地转换为委托返回类型

错误1无法隐式转换类型"System.Collections.Generic"。IEnumerable' to 'bool'

首先你应该过滤你的查询只得到非管理员用户:

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

你必须像这样创建一个List<SelectListItem> in控制器:

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>

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

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访问

你可以在你的selectlist中将db分配给"user"

:

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

最新更新