1

When I add new Role to my own account I have to log out and log back in so this role will start working. Is there a way to re-load roles on the fly (after adding/deleting) ?

I'm using Individual Accounts stored in Ms SQL Server 2012 in MVC 5.1.2 and Identity v. 2.0.0

Below is controller code:

   // GET: /Users/Edit/1
    public async Task<ActionResult> Edit(string id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        var user = await UserManager.FindByIdAsync(id);
        if (user == null)
        {
            return HttpNotFound();
        }

        var userRoles = await UserManager.GetRolesAsync(user.Id);

        return View(new EditUserViewModel()
        {
            Id = user.Id,
            Email = user.Email,
            FirstName = user.FirstName,
            LastName = user.LastName,
            CustomerID = user.CustomerID,
            siteID = user.SiteID,
            RolesList = RoleManager.Roles.ToList().Select(x => new SelectListItem()
            {
                Selected = userRoles.Contains(x.Name),
                Text = x.Name,
                Value = x.Name
            }),
            SitesList = db.sites.ToList().Select(y=> new SelectListItem()
            {
                Selected= user.SiteID==y.siteID,
                Text = y.siteCode,
                Value= y.siteID.ToString()
            })
        });
    }


    //
    // POST: /Users/Edit/5
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Edit([Bind(Include = "Email,Id,FirstName,LastName,CustomerID,siteID")] EditUserViewModel editUser, params string[] selectedRole)
    {
        if (ModelState.IsValid)
        {
            var user = await UserManager.FindByIdAsync(editUser.Id);
            if (user == null)
            {
                return HttpNotFound();
            }

            user.UserName = editUser.Email;
            user.Email = editUser.Email;
            user.FirstName = editUser.FirstName;
            user.LastName = editUser.LastName;
            user.CustomerID = editUser.CustomerID;
            user.SiteID = editUser.siteID; 

            var userRoles = await UserManager.GetRolesAsync(user.Id);

            selectedRole = selectedRole ?? new string[] { };

            var result = await UserManager.AddUserToRolesAsync(user.Id, selectedRole.Except(userRoles).ToList<string>());

            if (!result.Succeeded)
            {
                ModelState.AddModelError("", result.Errors.First());
                return View();
            }
            result = await UserManager.RemoveUserFromRolesAsync(user.Id, userRoles.Except(selectedRole).ToList<string>());

            if (!result.Succeeded)
            {
                ModelState.AddModelError("", result.Errors.First());
                return View();
            }
            return RedirectToAction("Index");
        }

        editUser.RolesList = RoleManager.Roles.ToList().Select(x => new SelectListItem()
        {
            //Selected = userRoles.Contains(x.Name),
            Text = x.Name,
            Value = x.Name
        });

        ModelState.AddModelError("", "Something failed.");
        return View(editUser);
    }
tereško
  • 58,060
  • 25
  • 98
  • 150
Adam W
  • 263
  • 1
  • 4
  • 12
  • Could you show the code where you add role? –  Apr 24 '14 at 22:23
  • Sure - I just edited my original question – Adam W Apr 24 '14 at 22:28
  • I am not sure about your methods. But I just red. What you have to is to find a way to refresh your context. In your case make sure you dispose your context after using it. It seems the state of your entity is unchanged even if you add role. –  Apr 24 '14 at 22:44

0 Answers0