代码之家  ›  专栏  ›  技术社区  ›  Aldemar Cuartas Carvajal

角色管理器。DeleteAsync或UpdateAsync在asp中未按预期工作。net core 2.0

  •  1
  • Aldemar Cuartas Carvajal  · 技术社区  · 8 年前

    我正在使用asp。net core 2.0 Identity和我有一个从IdentityRole继承的ApplicationRole类。根据文档,RoleManager为AspNetRoles表管理有关角色的CRUD操作,因此在Startup类中添加了服务:

    services.AddIdentity<ApplicationUser, ApplicationRole>()
            .AddEntityFrameworkStores<MyDbContext>()
            .AddDefaultTokenProviders();
    
    services.AddAuthentication()
    

    在配置方法中:

    app.UseAuthentication();
    

    在我的控制器中:

    public AdministrationController(
                RoleManager<ApplicationRole> roleManager,
                ILogger<AccountController> logger,
                IStringLocalizer<AccountController> localizer)
    {
       _roleManager = roleManager;
    }
    

    控制器操作:

    [HttpPost]
            public async Task<JsonResult> Role_Create([DataSourceRequest] DataSourceRequest request, ApplicationRoleViewModel role)
            {
                if (role != null && ModelState.IsValid)
                {
                    ApplicationRole identityRole = new ApplicationRole();
                    identityRole.Name = role.Name;
    
                    if (await _roleManager.RoleExistsAsync(identityRole.Name))
                    {
                        ModelState.AddModelError("Role", "Role already exists");
                    }
                    else
                    {
                        await _roleManager.CreateAsync(identityRole);
                    }
                }
    
                return Json(new[] { role }.ToDataSourceResult(request, ModelState));
            }
    
            [HttpPost]
            public async Task<JsonResult> Role_Update([DataSourceRequest] DataSourceRequest request, ApplicationRoleViewModel role)
            {
                if (role != null && ModelState.IsValid)
                {
                    ApplicationRole identityRole = new ApplicationRole();
                    identityRole.Id = role.Id;
                    identityRole.Name = role.Name;
                    await _roleManager.UpdateAsync(identityRole);
                }
    
                return Json(new[] { role }.ToDataSourceResult(request, ModelState));
            }
    
            [HttpPost]
            public async Task<JsonResult> Role_Delete([DataSourceRequest] DataSourceRequest request, ApplicationRoleViewModel role)
            {
                if (role != null)
                {
                    ApplicationRole identityRole = new ApplicationRole();
                    identityRole.Id = role.Id;
                    identityRole.Name = role.Name;
                    if (await _roleManager.RoleExistsAsync(identityRole.Name))
                    {
                        await _roleManager.DeleteAsync(identityRole);
                    }
                    else
                    {
                        ModelState.AddModelError("Role", "Role doesn't exist");
                    }
                }
    
                return Json(new[] { role }.ToDataSourceResult(request, ModelState));
            }
    

    _角色管理器。CreateAsync方法按预期工作,角色插入到AspNetRoles表中,但是\u roleManager。更新同步和角色管理器。DeleteAsync无法按预期工作,表仍显示相同的行,未更新或删除。

    操作前的表行:

    enter image description here

    更新操作:

    enter image description here

    删除操作:

    enter image description here

    操作完成后,表中显示的行与第一个屏幕截图中所示的行相同。假设RoleManager类管理对表的操作。

    1 回复  |  直到 8 年前
        1
  •  2
  •   jasonx    8 年前
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Edit(string id, [Bind("Id,Role")] RoleViewModel pRole)
        {
            if (id != pRole.Id)
            {
                return NotFound();
            }
    
            if (ModelState.IsValid)
            {
                try
                {
                    var role = await _roleManager.FindByIdAsync(pRole.Id);
                    role.Name = pRole.Role;
                    var result = await _roleManager.UpdateAsync(role);
                    if (!result.Succeeded)
                    {
                        ModelState.AddModelError("", result.Errors.First().ToString());
                        return View();
                    }
                    return RedirectToAction("Index");
                } catch (Exception)
                {
                    throw;
                }
            }
            return View(pRole);
        }