2015-04-15 2 views
1

Я следовал руководству по this page, о том, как добавлять роли пользователям программно в C# MVC. Однако, когда код выполняется я получаю следующее сообщение об ошибке:MVC InvalidOperationException, добавляющая роль пользователю

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

UPDATE:

ИТАК после принятия предложения всеобщего я переделывал свой код, чтобы выглядеть следующим образом:

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

Th Странно, я получаю ту же ошибку. Тем не менее, когда я наведите курсор мыши на моем параметр сейчас, это на самом деле имеет действительный идентификатор, а не нуль:

error persists with valid id value

Я замечаю значение я получаю, когда отладку не совпадают со значением в базе (это может быть связано с хэширования безопасности?)

DB Значение: 0752a8d8-fb0e-44d9-b8b0-57ccbbff826b

UPDATE 2:

для тех, кто, имеющий й Такая же проблема с идентификаторами, которые не совпадают, попробуйте использовать метод FindByName вместо FindByNameAsync. Работал для меня!

+1

Проверьте user2.id, как оно инициализируется –

+0

Спасибо за предложение, сделав некоторые изменения, вы были правы, что он не был инициализирован правильно. Однако даже после того, как действительное значение было на месте, оно по-прежнему не увенчалось успехом по той же причине. – Kyle

ответ

2

Сообщение об ошибке говорит вам проблему:

Message=UserId not found.

Вы никогда не устанавливая user2.Id поэтому, когда вы звоните AddToRole он не может найти пользователя, чтобы добавить роль, потому что user2.Id равна нулю.

Вы устанавливаете user2 здесь: var user2 = new ApplicationUser() { UserName = UserName };

Тогда вы ссылаетесь user2.Id здесь, но это не было установлено.

userManager.AddToRole(user2.Id, RoleName);

Попробуйте найти пользователя по идентификатору первым.

+0

О, хорошо, что имеет смысл. Мне просто сложно найти любую информацию о том, как получить идентификатор пользователя от имени пользователя. Первоначально это то, что я считал инициализацией user2, поскольку UserName будет равно UserName, введенному в поле на веб-странице. – Kyle

+0

Хорошо, это интересно, проверьте мои обновленные вопросы. – Kyle

Смежные вопросы