Asp.Net Mvc 使用用户角色编辑用户配置文件
Posted
技术标签:
【中文标题】Asp.Net Mvc 使用用户角色编辑用户配置文件【英文标题】:Asp.Net Mvc Edit User profile with user Role 【发布时间】:2018-03-26 17:40:21 【问题描述】:当我想获取当前用户角色名称,当我想编辑用户配置文件时,为什么我在 Asp.Net Mvc 代码中的操作会崩溃? 这段代码崩溃了
model.ApplicationRoleId = roleManager.Roles.Single(r => r.Name == userManager.GetRolesAsync(user).Result.Single()).Id;
我得到的错误信息是:500(内部服务器错误)
这是我的编辑用户视图
public class EditUserViewModel
public string Id get; set;
public string Name get; set;
public string Email get; set;
public List<SelectListItem> ApplicationRoles get; set;
public string ApplicationRoleId get; set;
public List<SelectListItem> DepartmentNames get; set;
public int DeptId get; set; // I have DeptId too in my AspNetUser table
还有我的 Edituser 操作
[HttpGet]
public async Task<IActionResult> EditUser(string id)
EditUserViewModel model = new EditUserViewModel();
model.ApplicationRoles = roleManager.Roles.Select(r => new SelectListItem
Text = r.Name,
Value = r.Id
).ToList();
model.DepartmentNames = context.Departments.Select(s => new SelectListItem
Text = s.DeptName,
Value = s.DeptId.ToString()
).ToList();
if (!String.IsNullOrEmpty(id))
ApplicationUser user = await userManager.FindByIdAsync(id);
if (user != null)
model.Name = user.Name;
model.Email = user.Email;
model.DeptId = user.DepartmentId;
//model.ApplicationRoleId crashing
model.ApplicationRoleId = roleManager.Roles.Single(r => r.Name == userManager.GetRolesAsync(user).Result.Single()).Id; // Here crashing .. I don't know why.. Server 500 error
ViewBag.RoleId = new SelectList(RoleManager.Roles, "Id", "Name", model.ApplicationRoleId);
ViewBag.DeptId = new SelectList(db.Departments, "Deptd", "DeptName", model.DeptId);
return PartialView("_EditUser", model);
我试过这样,但即使是这个崩溃..
string existingRole = UserManager.GetRolesAsync(user.Id).Result.Single();// This crashing
然后放在这里:
string existingRoleId = RoleManager.Roles.Single(r => r.Name == existingRole).Id;
但是字符串existingRole 对我不起作用..
如有任何帮助,我将不胜感激。
【问题讨论】:
您不应该使用Result
调用异步方法。等待你的方法,如var r=await UserManager.GetRolesAsync(user.Id); var existingRole=u.First();
当你确定你的集合总是只有一个项目时,也使用 Single 方法,否则它会抛出一个 InvalidOperationException
异常。
@Shyju 谢谢你的回复,但你是什么意思 var r=await UserManager.GetRolesAsync(user.Id);?把这个结果放在哪里?你的意思是model.ApplicationRoleId = wait UserManager.GetRolesAsync(user.Id);?然后 var existingRole=u.First() ?你要去哪里?你必须在某处声明......我的意思是我应该初始化我的model.ApplicationRoleId什么? .再次感谢您。
@Shyju ,你能帮忙吗..?
【参考方案1】:
@Shyju 写的我确实喜欢这个
var role = await UserManager.GetRolesAsync(user.Id);
var existingRole = role.First();
if (existingRole != null)
string existingRoleId = RoleManager.Roles.Single(r => r.Name == existingRole).Id;
model.ApplicationRoleId = existingRoleId;
..... and so on ....
谢谢@Shyju
【讨论】:
以上是关于Asp.Net Mvc 使用用户角色编辑用户配置文件的主要内容,如果未能解决你的问题,请参考以下文章
七天学会ASP.NET MVC ——Layout页面使用和用户角色管理
ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 17. 基于Claim和Policy的授权 上