【问题标题】:MVC InvalidOperationException adding role to userMVC InvalidOperationException 向用户添加角色
【发布时间】:2015-04-15 01:12:02
【问题描述】:

我正在关注this page 上的教程,关于如何在 C# MVC 中以编程方式向用户添加角色。但是,当代码执行时,我收到以下错误:

System.InvalidOperationException was unhandled by user code
  HResult=-2146233079
  Message=UserId not found.
  Source=Microsoft.AspNet.Identity.Core
  StackTrace:
       at Microsoft.AspNet.Identity.UserManager`2.<AddToRoleAsync>d__83.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
       at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
       at Microsoft.AspNet.Identity.AsyncHelper.RunSync[TResult](Func`1 func)
       at Microsoft.AspNet.Identity.UserManagerExtensions.AddToRole[TUser,TKey](UserManager`2 manager, TKey userId, String role)
       at SchoolRegistration.Controllers.AccountController.RoleAddToUser(FormCollection collection) in c:\Users\Kyle\Documents\Visual Studio 2013\Projects\SchoolRegistration\SchoolRegistration\Controllers\AccountController.cs:line 98
       at lambda_method(Closure , ControllerBase , Object[] )
       at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
       at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
       at System.Web.Mvc.Async.AsyncControllerActionInvoker.ActionInvocation.InvokeSynchronousActionMethod()
       at System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState)
       at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult)
       at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
       at System.Web.Mvc.Async.AsyncResultWrapper.End[TResult](IAsyncResult asyncResult, Object tag)
       at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
       at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d()
       at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f()
  InnerException: 

但我不知道是什么导致了这个错误。任何帮助将不胜感激。

代码:

在我的帐户控制器内部:

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult RoleAddToUser(FormCollection collection)
        {
            string UserName = collection["UserName"];
            string RoleName = collection["RoleName"];
            using (var context = new ApplicationDbContext()) {
            ApplicationUser user = context.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
            var user2 = new ApplicationUser() { UserName = UserName };
            var roleStore = new RoleStore<IdentityRole>(context);
            var roleManager = new RoleManager<IdentityRole>(roleStore);
            var userStore = new UserStore<ApplicationUser>(context);
            var userManager = new UserManager<ApplicationUser>(userStore);
            userManager.AddToRole(user2.Id, RoleName);
            var account = new AccountController();
            //account.UserManager.AddToRole(user.Id, RoleName);
            ViewBag.ResultMessage = "Role added successfully.";

            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");
        }

更新:

好的,在听取了大家的建议后,我重新编写了代码,如下所示:

[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult RoleAddToUser(FormCollection collection)
        {
            string UserName = collection["UserName"];
            string RoleName = collection["RoleName"];
            using (var context = new ApplicationDbContext()) {
            ApplicationUser user = context.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
            var user2 = UserManager.FindByNameAsync(UserName);
            var roleStore = new RoleStore<IdentityRole>(context);
            var roleManager = new RoleManager<IdentityRole>(roleStore);
            var userStore = new UserStore<ApplicationUser>(context);
            var userManager = new UserManager<ApplicationUser>(userStore);
            userManager.AddToRole(user2.Id.ToString(),RoleName);
            var account = new AccountController();
            //account.UserManager.AddToRole(user.Id, RoleName);
            ViewBag.ResultMessage = "Role added successfully.";

            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");
        }

奇怪的是,我得到了完全相同的错误。但是,当我现在将鼠标悬停在我的参数上时,它实际上确实有一个有效的 id 而不是 null:

我确实注意到调试时收到的值与数据库中的值不同(这可能是由于散列安全性造成的?)

数据库值:0752a8d8-fb0e-44d9-b8b0-57ccbbff826b

更新 2:

对于遇到 ID 不匹配的相同问题的任何人,请尝试使用 FindByName 方法而不是 FindByNameAsync。为我工作!

【问题讨论】:

  • 检查 user2.id,它是如何被初始化的
  • 感谢您的建议,在进行了一些更改后,您是正确的,它没有被正确初始化。但是,即使设置了有效值,由于同样的原因,它仍然不成功。

标签: c# asp.net-mvc invalidoperationexception


【解决方案1】:

错误信息告诉你问题:

Message=找不到用户 ID。

您永远不会设置 user2.Id,因此当您调用 AddToRole 时,它​​找不到要添加角色的用户,因为 user2.Id 为空。

您在此处设置了 user2: var user2 = new ApplicationUser() { UserName = UserName };

然后您在此处引用user2.Id,但尚未设置。

userManager.AddToRole(user2.Id, RoleName);

尝试先通过 id 查找用户。

【讨论】:

  • 哦,好吧,这确实有道理。我只是很难找到有关从用户名获取用户 ID 的任何信息。最初这就是我认为 user2 初始化所做的事情,因为 UserName 将等于在网页上的字段中键入的 UserName。
猜你喜欢
  • 2015-02-01
  • 2017-01-01
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
  • 2018-09-10
  • 1970-01-01
  • 2021-06-11
相关资源
最近更新 更多