繁体   English   中英

Asp.net MVC 5,Identity 2.0无法向用户添加角色

[英]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 userIdrolename要将您要分配给用户的角色。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM