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 userIdrolename你想分配给用户的角色。

var result = UserManager.AddToRole(userId, "RoleName"); 
+0

这对我很有用,谢谢你Manish Sharma – Prasanth 2014-12-08 08:57:59

错误,“对象未设置为一个对象的实例。”,意思是你有一些变量,你调用某个属性或方法评价在运行时为null。

例如,您要将用户拉出数据库,然后再引用Id属性,即user.Id。但是,如果没有找到用户,您的user变量实际上是null,并且null没有属性Id,因此是错误。

任何时候你有一个变量可以是一个类型的实例或null,你需要在使用它之前检查一个空值,以确保你没有像这样的运行时错误。

if (user != null) 
{ 
    // use your `user` variable here 
} 

现在,我不知道,如果你的user变量实际上是空。它可能是其他的东西,但这是在调试这样的错误时应该寻找的东西。在Visual Studio中运行调试器并检查操作中的所有变量。如果有的话是空的,那很可能是你的候选人。

另外,请,一切好的和神圣世界的爱,做在另一个控制器的动作不实例化一个控制器,尤其是刚刚在默认情况下得到的UserManagerAccountController。可以将相同的属性添加到每个需要它的控制器,因为AccountController可以,甚至更好地通过DI(依赖注入)容器将其注入到控制器中,并将其设置为请求范围。

+0

我在调试模式下已经检查了,我得到的用户ID – Prasanth 2014-12-03 17:02:20

+0

作为我说过,它可能不是'用户',它是空的。我只是用它作为例子。 *某物*为空。找到它,你会解决你的问题。 – 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); 

     ... 
     ... 
    }