[英]Asp.net MVC 5, Identity 2.0 Unable to add a Role to user
我正在尝试使用控制器向特定用户添加角色。 但是,我遇到了错误
这是我的角色控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult RoleAddToUser(string UserName, string RoleName)
{
ApplicationUser user = context.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
var account = new AccountController();
account.UserManager.AddToRole(user.Id, RoleName);
ViewBag.ResultMessage = "Role created successfully !";
// prepopulat roles for the view dropdown
var list = context.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList();
ViewBag.Roles = list;
return View("ManageUserRoles");
}
这是我的动作控制器:
public class AccountController : Controller
{
private ApplicationUserManager _userManager;
public AccountController()
{
}
public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager )
{
UserManager = userManager;
SignInManager = signInManager;
}
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
这是我得到的错误:
“ /”应用程序中的服务器错误。
你调用的对象是空的。
说明:执行当前Web请求期间发生未处理的异常。 请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。
异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。
源错误:
Line 32: get
Line 33: {
Line 34: return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
Line 35: }
Line 36: private set
错误“对象引用未设置为对象的实例。”,意味着您要调用的某个变量的属性或方法在运行时评估为null。
例如,您user.Id
数据库中拉出用户,然后再引用其Id
属性,即user.Id
但是,如果未找到用户,则您的user
变量实际上为null ,并且null没有属性Id
,因此发生错误。
每当您拥有一个可能是类型实例或null实例的变量时,都需要在使用null值之前检查它,以确保不会出现这样的运行时错误。
if (user != null)
{
// use your `user` variable here
}
现在,我不确定您的user
变量是否实际上为null。 可能还有其他事情,但这是调试此类错误时应寻找的东西。 在Visual Studio中运行调试器,并检查操作中的所有变量。 如果为空,则很可能是您的候选人。
另外,为了爱世界上所有美好而神圣的事物,请不要在另一个控制器中的操作中实例化一个控制器,尤其是默认情况下仅在AccountController
中使用UserManager
。 可以像AccountController
一样向需要的每个控制器添加相同的属性,或者甚至更好的方法是,通过DI(依赖项注入)容器将其注入到控制器中,并将其设置为request-scope。
尝试这个,
添加Rolemanger类属性并添加AccountController
。
public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager, ApplicationRoleManager roleManager)
{
UserManager = userManager;
SignInManager = signInManager;
RoleManager =roleManager;
}
private ApplicationRoleManager _roleManager;
public ApplicationRoleManager RoleManager
{
get
{
return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>();
}
private set
{
_roleManager = value;
}
}
将其添加到页面后。 用户此角色分配给用户。 传递您用户的ID userId
和rolename
要将您要分配给用户的角色。
var result = UserManager.AddToRole(userId, "RoleName");
将其添加到App_Start文件夹的Startup.Auth.cs文件中
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
如下:
public void ConfigureAuth(IAppBuilder app)
{
// Configure the db context, user manager and signin manager to use a single instance per request
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
...
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.