试图在 DropDownList 中显示所有角色?
Trying to display all roles in a DropDownList?
我试图在 DropDownList
中显示来自我的 RoleManager
的所有可用角色,然后 select 用户所属的特定角色。对此的要求是用户只能处于一个角色(“用户、管理员或无访问权限”)。
当我获得角色列表并将它们分配给我的 ViewModel 时,当我尝试显示它们时出现错误:
Cannot convert from ‘System.Collections.Generic.IEnumberable<SiteName.Models.AppRole>’ to ‘Systems.Collections.IEnumerable<System.Web.Mvc.SelectListItem>.
我是否需要创建一个仅用于获取 RoleName 和 RoleId 的 ViewModel,然后遍历我从 RoleManger 获取的角色列表并填充该 ViewModel 的列表以传递到我的视图?当我已经有一个继承自 IdentityRole 的 class (AppRole) 时,这似乎是额外的代码,它应该具有 Role.Name 和 Role.Id.
这是我的 editing/displaying 用户的 ViewModel:
public class UserEditVM : BaseViewModel
{
public string Id { get; set; }
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string UserRole { get; set; }
public string RoleID { get; set; }
public IEnumerable<AppRole> AllRoles { get; set; }
public IEnumerable<SelectListItem> RolesList { get; set; }
public bool IsActive { get; set; }
}
这是我创建虚拟机对象的控制器。我已经尝试将列表作为 AppRole 和 SelectListItem。两者都给我与上面相同的错误。
private async Task<UserEditVM> createUserVM(AppUser user)
{
var userRoles = await UserManager.GetRolesAsync(user.Id);
var allRoles = RoleManager.Roles.ToList();
string roleName = userRoles.Count() == 0 ? "User" : userRoles[0];
UserEditVM editUser = new UserEditVM();
editUser.Id = user.Id;
editUser.UserName = user.UserName;
editUser.FirstName = user.FirstName;
editUser.LastName = user.LastName;
editUser.Email = user.Email;
editUser.UserRole = roleName;
editUser.AllRoles = RoleManager.Roles.ToList();
editUser.RolesList = new SelectList(RoleManager.Roles.ToList(), "Id", "Name"); ;
editUser.IsActive = user.IsActive;
return editUser;
}
这是 AppRole。从 IdentityRole 继承,它应该已经具有 Role .Name 和 .Id 可用。
public class AppRole : IdentityRole
{
public AppRole() : base() { }
public AppRole(string name) : base(name) { }
}
这是我试图在 DDL 中显示它们的视图。
<div class="form-group">
<label>Role:</label> @Html.DisplayNameFor(model => model.UserRole)
@Html.DropDownListFor(model => model.Id, Model.AllRoles)
</div>
更新
这是我更新后的 VM
public class UserEditVM : BaseViewModel
{
public string Id { get; set; }
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string UserRole { get; set; }
public string RoleID { get; set; }
public IEnumerable<AppRole> AllRoles { get; set; }
public IEnumerable<SelectListItem> RolesList { get; set; }
public string SelectedRoleId { get; set; }
public bool IsActive { get; set; }
}
这是我的控制器。我的 AppRole class 继承自具有 .Id 和 .Name 属性 的 IdentityRole。
private async Task<UserEditVM> createUserVM(AppUser user)
{
var userRoles = await UserManager.GetRolesAsync(user.Id);
var allRoles = RoleManager.Roles.ToList();
string roleName = userRoles.Count() == 0 ? "User" : userRoles[0];
UserEditVM editUser = new UserEditVM();
editUser.Id = user.Id;
editUser.UserName = user.UserName;
editUser.FirstName = user.FirstName;
editUser.LastName = user.LastName;
editUser.Email = user.Email;
editUser.UserRole = roleName;
editUser.AllRoles = RoleManager.Roles.Select(r => new AppRole { Id = r.Id, Name = r.Name }).ToList();
//editUser.RolesList = new SelectList(RoleManager.Roles.ToList(), "Id", "Name"); ;
editUser.IsActive = user.IsActive;
return editUser;
}
这是我在我的视图中尝试过的
<div class="form-group">
<label>Role:</label> @Html.DisplayNameFor(model => model.UserRole)
@Html.DropDownListFor(model => model.SelectedRoleId, Model.AllRoles, "Select")
</div>
在视图中我仍然收到错误消息“cannot convert from ‘System.Collections.Generic.IEnumberable<SiteName.Models.AppRole>’ to ‘System.Collections.Generic.IEnumberable<System.Web.Mvc.SelectListItem>’
固定更新
这是最后的修复。最后,问题出在我的 ViewModel 中的 Using 语句上。当我第一次添加 IEnumberable 时,我使用 VisualStudio 2015 中的 QuickFix 功能来解析引用。问题在于它建议 "using System.Web.WebPages.Html" 而我真正需要的是 "using System.Web.Mvc"。这可以在我得到的最后一个错误中看到。一旦我切换了 using 语句,它就起作用了。
这就是我的结局
using System.Collections.Generic;
//using System.Web.WebPages.Html;
using System.Web.Mvc;
namespace SampleMvcSite.Models
{
public class UserEditVM : BaseViewModel
{
public string Id { get; set; }
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string UserRole { get; set; }
public string RoleID { get; set; }
public IEnumerable<AppRole> AllRoles { get; set; }
public IEnumerable<SelectListItem> RolesList { get; set; }
public string SelectedRoleId { get; set; }
public bool IsActive { get; set; }
}
}
控制器
private async Task<UserEditVM> createUserVM(AppUser user)
{
var userRoles = await UserManager.GetRolesAsync(user.Id);
string roleName = userRoles.Count() == 0 ? "User" : userRoles[0];
var allRoles = RoleManager.Roles.ToList();
UserEditVM editUser = new UserEditVM();
editUser.Id = user.Id;
editUser.UserName = user.UserName;
editUser.FirstName = user.FirstName;
editUser.LastName = user.LastName;
editUser.Email = user.Email;
editUser.UserRole = roleName;
editUser.RolesList = allRoles.Select(s => new SelectListItem
{
Value = s.Id.ToString(),
Text = s.Name,
Selected = s.Name == roleName ? true : false
});
editUser.IsActive = user.IsActive;
return editUser;
}
查看
<div class="form-group">
<label>Current Role:</label>
@Html.DropDownListFor(model => model.SelectedRoleId, Model.RolesList, "Select Role")
</div>
对于你的编译错误。
看起来 RoleManager.Roles
return 你是一个不同于你在视图模型中声明的类型的集合 (IEnumberable<AppRole>
)。在这种情况下,您需要将其转换为 AppRole 的集合。
editUser.AllRoles = RoleManager.Roles
.Select(s=>new AppRole { Id = s.Id, Name = s.Name).toList();
假设 AppRole class 具有要用于显示下拉列表的 Id 和 Name 属性。如果您的 属性 名称不同,请更改上述代码的投影部分。
但显然,您没有在视图中使用 AllRoles
集合。
修复你的 Razor 错误
再添加一个 属性 到您的视图模型以存储从下拉列表中选择的角色
public class UserEditVM : BaseViewModel
{
public int SelectedRoleId {set;get;}
public IEnumerable<SelectListItem> RolesList { get; set; }
//Other properties as needed.
}
并且在您的 GET 操作方法中,您获得了所有角色(可以是 Role class 或一些自定义 class 的集合),将其转换为 SelectListItem
并将其分配给 UserEditVM
对象的 RolesList
属性。
public ActionResult Create()
{
var vm=new UserEditVM();
var allRoles= RoleManager.Roles.ToList();
vm.RolesList = allRoles.Select(s => new SelectListItem
{
Value = s.Id.ToString(),
Text = s.Name
});
return View(vm);
}
并且在剃须刀视图中,使用 RolesList
属性 这是 SelectListItem
的集合
@model YourNameSpace.UserEditVM
@Html.DropDownListFor(x=> x.SelectedRoleId, Model.RolesList,"Select")
现在当用户提交表单时,选择的角色 ID 将在发布模型的 SelectedRoleId
属性 中。
[HttpPost]
public ActionResult Edit(UserEditVM model)
{
//check model.SelectedRoleId
//to do : Save and Redirect
}
您已经拥有正确的数据,但在您模型的另一个 属性 中。您需要使用 RolesList
,而不是 AllRoles
。例如:
@Html.DropDownListFor(model => model.Id, Model.RolesList)
我试图在 DropDownList
中显示来自我的 RoleManager
的所有可用角色,然后 select 用户所属的特定角色。对此的要求是用户只能处于一个角色(“用户、管理员或无访问权限”)。
当我获得角色列表并将它们分配给我的 ViewModel 时,当我尝试显示它们时出现错误:
Cannot convert from ‘System.Collections.Generic.IEnumberable<SiteName.Models.AppRole>’ to ‘Systems.Collections.IEnumerable<System.Web.Mvc.SelectListItem>.
我是否需要创建一个仅用于获取 RoleName 和 RoleId 的 ViewModel,然后遍历我从 RoleManger 获取的角色列表并填充该 ViewModel 的列表以传递到我的视图?当我已经有一个继承自 IdentityRole 的 class (AppRole) 时,这似乎是额外的代码,它应该具有 Role.Name 和 Role.Id.
这是我的 editing/displaying 用户的 ViewModel:
public class UserEditVM : BaseViewModel
{
public string Id { get; set; }
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string UserRole { get; set; }
public string RoleID { get; set; }
public IEnumerable<AppRole> AllRoles { get; set; }
public IEnumerable<SelectListItem> RolesList { get; set; }
public bool IsActive { get; set; }
}
这是我创建虚拟机对象的控制器。我已经尝试将列表作为 AppRole 和 SelectListItem。两者都给我与上面相同的错误。
private async Task<UserEditVM> createUserVM(AppUser user)
{
var userRoles = await UserManager.GetRolesAsync(user.Id);
var allRoles = RoleManager.Roles.ToList();
string roleName = userRoles.Count() == 0 ? "User" : userRoles[0];
UserEditVM editUser = new UserEditVM();
editUser.Id = user.Id;
editUser.UserName = user.UserName;
editUser.FirstName = user.FirstName;
editUser.LastName = user.LastName;
editUser.Email = user.Email;
editUser.UserRole = roleName;
editUser.AllRoles = RoleManager.Roles.ToList();
editUser.RolesList = new SelectList(RoleManager.Roles.ToList(), "Id", "Name"); ;
editUser.IsActive = user.IsActive;
return editUser;
}
这是 AppRole。从 IdentityRole 继承,它应该已经具有 Role .Name 和 .Id 可用。
public class AppRole : IdentityRole
{
public AppRole() : base() { }
public AppRole(string name) : base(name) { }
}
这是我试图在 DDL 中显示它们的视图。
<div class="form-group">
<label>Role:</label> @Html.DisplayNameFor(model => model.UserRole)
@Html.DropDownListFor(model => model.Id, Model.AllRoles)
</div>
更新
这是我更新后的 VM
public class UserEditVM : BaseViewModel
{
public string Id { get; set; }
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string UserRole { get; set; }
public string RoleID { get; set; }
public IEnumerable<AppRole> AllRoles { get; set; }
public IEnumerable<SelectListItem> RolesList { get; set; }
public string SelectedRoleId { get; set; }
public bool IsActive { get; set; }
}
这是我的控制器。我的 AppRole class 继承自具有 .Id 和 .Name 属性 的 IdentityRole。
private async Task<UserEditVM> createUserVM(AppUser user)
{
var userRoles = await UserManager.GetRolesAsync(user.Id);
var allRoles = RoleManager.Roles.ToList();
string roleName = userRoles.Count() == 0 ? "User" : userRoles[0];
UserEditVM editUser = new UserEditVM();
editUser.Id = user.Id;
editUser.UserName = user.UserName;
editUser.FirstName = user.FirstName;
editUser.LastName = user.LastName;
editUser.Email = user.Email;
editUser.UserRole = roleName;
editUser.AllRoles = RoleManager.Roles.Select(r => new AppRole { Id = r.Id, Name = r.Name }).ToList();
//editUser.RolesList = new SelectList(RoleManager.Roles.ToList(), "Id", "Name"); ;
editUser.IsActive = user.IsActive;
return editUser;
}
这是我在我的视图中尝试过的
<div class="form-group">
<label>Role:</label> @Html.DisplayNameFor(model => model.UserRole)
@Html.DropDownListFor(model => model.SelectedRoleId, Model.AllRoles, "Select")
</div>
在视图中我仍然收到错误消息“cannot convert from ‘System.Collections.Generic.IEnumberable<SiteName.Models.AppRole>’ to ‘System.Collections.Generic.IEnumberable<System.Web.Mvc.SelectListItem>’
固定更新
这是最后的修复。最后,问题出在我的 ViewModel 中的 Using 语句上。当我第一次添加 IEnumberable 时,我使用 VisualStudio 2015 中的 QuickFix 功能来解析引用。问题在于它建议 "using System.Web.WebPages.Html" 而我真正需要的是 "using System.Web.Mvc"。这可以在我得到的最后一个错误中看到。一旦我切换了 using 语句,它就起作用了。
这就是我的结局
using System.Collections.Generic;
//using System.Web.WebPages.Html;
using System.Web.Mvc;
namespace SampleMvcSite.Models
{
public class UserEditVM : BaseViewModel
{
public string Id { get; set; }
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string UserRole { get; set; }
public string RoleID { get; set; }
public IEnumerable<AppRole> AllRoles { get; set; }
public IEnumerable<SelectListItem> RolesList { get; set; }
public string SelectedRoleId { get; set; }
public bool IsActive { get; set; }
}
}
控制器
private async Task<UserEditVM> createUserVM(AppUser user)
{
var userRoles = await UserManager.GetRolesAsync(user.Id);
string roleName = userRoles.Count() == 0 ? "User" : userRoles[0];
var allRoles = RoleManager.Roles.ToList();
UserEditVM editUser = new UserEditVM();
editUser.Id = user.Id;
editUser.UserName = user.UserName;
editUser.FirstName = user.FirstName;
editUser.LastName = user.LastName;
editUser.Email = user.Email;
editUser.UserRole = roleName;
editUser.RolesList = allRoles.Select(s => new SelectListItem
{
Value = s.Id.ToString(),
Text = s.Name,
Selected = s.Name == roleName ? true : false
});
editUser.IsActive = user.IsActive;
return editUser;
}
查看
<div class="form-group">
<label>Current Role:</label>
@Html.DropDownListFor(model => model.SelectedRoleId, Model.RolesList, "Select Role")
</div>
对于你的编译错误。
看起来 RoleManager.Roles
return 你是一个不同于你在视图模型中声明的类型的集合 (IEnumberable<AppRole>
)。在这种情况下,您需要将其转换为 AppRole 的集合。
editUser.AllRoles = RoleManager.Roles
.Select(s=>new AppRole { Id = s.Id, Name = s.Name).toList();
假设 AppRole class 具有要用于显示下拉列表的 Id 和 Name 属性。如果您的 属性 名称不同,请更改上述代码的投影部分。
但显然,您没有在视图中使用 AllRoles
集合。
修复你的 Razor 错误
再添加一个 属性 到您的视图模型以存储从下拉列表中选择的角色
public class UserEditVM : BaseViewModel
{
public int SelectedRoleId {set;get;}
public IEnumerable<SelectListItem> RolesList { get; set; }
//Other properties as needed.
}
并且在您的 GET 操作方法中,您获得了所有角色(可以是 Role class 或一些自定义 class 的集合),将其转换为 SelectListItem
并将其分配给 UserEditVM
对象的 RolesList
属性。
public ActionResult Create()
{
var vm=new UserEditVM();
var allRoles= RoleManager.Roles.ToList();
vm.RolesList = allRoles.Select(s => new SelectListItem
{
Value = s.Id.ToString(),
Text = s.Name
});
return View(vm);
}
并且在剃须刀视图中,使用 RolesList
属性 这是 SelectListItem
@model YourNameSpace.UserEditVM
@Html.DropDownListFor(x=> x.SelectedRoleId, Model.RolesList,"Select")
现在当用户提交表单时,选择的角色 ID 将在发布模型的 SelectedRoleId
属性 中。
[HttpPost]
public ActionResult Edit(UserEditVM model)
{
//check model.SelectedRoleId
//to do : Save and Redirect
}
您已经拥有正确的数据,但在您模型的另一个 属性 中。您需要使用 RolesList
,而不是 AllRoles
。例如:
@Html.DropDownListFor(model => model.Id, Model.RolesList)