找到用于更新用户角色的代码,但不显示[HttpGet]方法或ViewPage

问题描述 投票:-1回答:1

我发现一些代码声称是更新用户角色的成功方法。但是,该解决方案仅显示[HttpPost]方法的代码。因为我是ASP.NET MVC的新手,所以我不确定[HttpGet]方法或ViewPage中将使用什么。

只是想知道是否有人可以看一下代码并给出一些建议或给我一个全新的方向。

我将显示当前拥有的代码,因为当我更改附加到用户的角色时,角色不会更新。

谢谢!

        [HttpGet]
        public ActionResult ManageUserRoles()
        {
            var roleList = _context.Roles.OrderBy(r => r.Name).ToList().Select(rr =>
                new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList();
            ViewBag.Roles = roleList;

            var userList = _context.Users.OrderBy(u => u.UserName).ToList().Select(uu =>
                new SelectListItem { Value = uu.UserName.ToString(), Text = uu.UserName }).ToList();
            ViewBag.Users = userList;
            return View();

        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult ManageUserRoles(string UserName, string RoleName)
        {
            ApplicationUser user = _context.Users.Where(u => u.UserName.Equals(UserName,
                StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();

            var um = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(_context));

            var roleList = _context.Roles.OrderBy(r => r.Name).ToList()
            .Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList();
            ViewBag.Roles = roleList;

            var userList = _context.Users
            .OrderBy(u => u.UserName).ToList()
            .Select(uu => new SelectListItem { Value = uu.UserName.ToString(), Text = uu.UserName }).ToList();
            ViewBag.Users = userList;
            return View("ManageUserRoles");

MANAGEUSERROLES VIEW

@using (Html.BeginForm("GetAllUsers", "UserAdmin"))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    <p>
        UserName: @Html.DropDownList("UserName",
            (IEnumerable<SelectListItem>)ViewBag.Users, "Select...")
        Role Name: @Html.DropDownList("RoleName",
            (IEnumerable<SelectListItem>)ViewBag.Roles, "Select...")
    </p>
    <input type="submit" value="Save" />
}

从其他堆栈溢出帖子中找到的代码

    [HttpPost]
    [ValidateAntiForgeryToken]
    public virtual ActionResult ManageUser(ApplicationUser user, string role)
    {
        if  (ModelState.IsValid)
        {
            var oldUser = _userManager.FindById(user.Id);
            var oldRoleId = oldUser.Roles.SingleOrDefault().RoleId;
            var oldRoleName = _context.Roles.SingleOrDefault(r => r.Id == oldRoleId).Name;

            if (oldRoleName != role)
            {
                _userManager.RemoveFromRole(user.Id, oldRoleName);
                _userManager.AddToRole(user.Id, role);

            }
            _context.Entry(user).State = System.Data.Entity.EntityState.Modified;

            return RedirectToAction("GetAllApplicationUsers", "UserAdmin");
        }

        return View(user);

    }
asp.net asp.net-mvc model-view-controller
1个回答
0
投票

顾名思义,HTTP GET操作通常只会得到一些东西。 POST用于通过请求正文将数据传递回服务器,PUT或PATCH更新否则将更新现有数据,而DELETE删除数据。

您表示不知道GET操作会发生什么。您想得到什么?

通常,在GET操作中,您传入特定实体的标识符以检索或排除任何有利于列出所有内容的参数。

尚不清楚您要具体做什么,但是,例如,如果您想要获得角色本身,则可能有:

[HttpGet("role/{roleId}")]
public virtual IActionResult GetRole(int roleId) //Can't tell from your code what type Id uses
{
  var role = DB.Roles.SingleOrDefault(r => r.Id == roleId);
  return Ok(role);
}

当然,您可能希望将此结果映射到某种其他类,因为您的调用者可能不需要您存储在数据库中的所有信息。

[您提到对代码提出建议-它是否有问题,需要更改?您是否正在寻找优化?

© www.soinside.com 2019 - 2024. All rights reserved.