MVC5帐户控制器空引用exception

我正在尝试将用户角色实现到我的MVC Web应用程序中。 但是我在行return _userManager ?? HttpContext.GetOwinContext().GetUserManager();上得到一个nullexceptionreturn _userManager ?? HttpContext.GetOwinContext().GetUserManager(); return _userManager ?? HttpContext.GetOwinContext().GetUserManager(); 在我的帐户控制器中。

账户管理员

 [Authorize] public class AccountController : Controller { private ApplicationSignInManager _signInManager; private ApplicationUserManager _userManager; private ApplicationRoleManager _roleManager; public AccountController(){} public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager, ApplicationRoleManager roleManager) { UserManager = userManager; SignInManager = signInManager; RoleManager = roleManager; } public ApplicationRoleManager RoleManager { get { return _roleManager ?? HttpContext.GetOwinContext().Get(); } private set { _roleManager = value; } } public ApplicationSignInManager SignInManager { get { return _signInManager ?? HttpContext.GetOwinContext().Get(); } private set { _signInManager = value; } } public ApplicationUserManager UserManager { get { return _userManager ?? HttpContext.GetOwinContext().GetUserManager(); } private set {_userManager = value; } } 

ActionResult将触发将用户添加到角色。

  [System.Web.Mvc.HttpPost] [ValidateAntiForgeryToken] public ActionResult RoleAddToUser(string UserName, string RoleName) { ApplicationUser user = context.Users.FirstOrDefault(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)); var account = new AccountController(); if (user != null) account.UserManager.AddToRole(user.Id, RoleName); 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"); } 

Startup.Auth确实包含

  app.CreatePerOwinContext(ApplicationDbContext.Create); app.CreatePerOwinContext(ApplicationRoleManager.Create); app.CreatePerOwinContext(ApplicationUserManager.Create); app.CreatePerOwinContext(ApplicationSignInManager.Create); 

身份配置

  // Configure the application sign-in manager which is used in this application. public class ApplicationSignInManager : SignInManager { public ApplicationSignInManager(ApplicationUserManager userManager, IAuthenticationManager authenticationManager) : base(userManager, authenticationManager) { } public override Task CreateUserIdentityAsync(ApplicationUser user) { return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager); } public static ApplicationSignInManager Create(IdentityFactoryOptions options, IOwinContext context) { return new ApplicationSignInManager(context.GetUserManager(), context.Authentication); } } public class ApplicationRoleManager : RoleManager { public ApplicationRoleManager(IRoleStore roleStore) : base(roleStore) { } public static ApplicationRoleManager Create(IdentityFactoryOptions options, IOwinContext context) { return new ApplicationRoleManager(new RoleStore(context.Get())); } } 

空引用来自哪里? 在代码中,我仔细检查用户是否存在。

谢谢

这些无疑是令人讨厌的线……

 var account = new AccountController(); if (user != null) account.UserManager.AddToRole(user.Id, RoleName); 

控制器并不意味着以这种方式实例化,因为它们与当前的HTTP请求(因此是HttpContext )密切相关。

HttpContext.GetOwinContext().GetUserManager(); 得到命中, HttpContext为null,因为没有上下文。

您只需将相同的属性放在您尝试访问UserManager的控制器中。 这是有效的,因为OwinContext在整个应用程序中共享。

 public class HomeController : Controller { public ApplicationUserManager UserManager { get { return _userManager ?? HttpContext.GetOwinContext().GetUserManager(); } private set {_userManager = value; } } public ActionResult RoleAddToUser(string UserName, string RoleName) { ApplicationUser user = context.Users.FirstOrDefault(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)); if (user != null) UserManager.AddToRole(user.Id, RoleName); //Other code... return View("ManageUserRoles"); } } 

如果你想变得非常花哨,请声明一个inheritance自ControllerBaseController ,将UserManager属性放入其中,并让所有其他控制器inheritance自你的基础。