Asp.net MVC 5,身份2.0无法添加角色给用户
我想添加一个角色给使用控制器的特定用户。但是,我得到错误Asp.net MVC 5,身份2.0无法添加角色给用户
这里我的角色控制器:
[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
试试这个,
添加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");
错误,“对象未设置为一个对象的实例。”,意思是你有一些变量,你调用某个属性或方法评价在运行时为null。
例如,您要将用户拉出数据库,然后再引用Id
属性,即user.Id
。但是,如果没有找到用户,您的user
变量实际上是null,并且null没有属性Id
,因此是错误。
任何时候你有一个变量可以是一个类型的实例或null,你需要在使用它之前检查一个空值,以确保你没有像这样的运行时错误。
if (user != null)
{
// use your `user` variable here
}
现在,我不知道,如果你的user
变量实际上是空。它可能是其他的东西,但这是在调试这样的错误时应该寻找的东西。在Visual Studio中运行调试器并检查操作中的所有变量。如果有的话是空的,那很可能是你的候选人。
另外,请,一切好的和神圣世界的爱,做在另一个控制器的动作不实例化一个控制器,尤其是刚刚在默认情况下得到的UserManager
在AccountController
。可以将相同的属性添加到每个需要它的控制器,因为AccountController
可以,甚至更好地通过DI(依赖注入)容器将其注入到控制器中,并将其设置为请求范围。
我在调试模式下已经检查了,我得到的用户ID – Prasanth 2014-12-03 17:02:20
作为我说过,它可能不是'用户',它是空的。我只是用它作为例子。 *某物*为空。找到它,你会解决你的问题。 – 2014-12-03 17:03:13
在Startup.Auth.cs文件中App_Start文件夹添加此
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);
...
...
}
这对我很有用,谢谢你Manish Sharma – Prasanth 2014-12-08 08:57:59