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自Controller
的BaseController
,将UserManager
属性放入其中,并让所有其他控制器inheritance自你的基础。