簡體   English   中英

如何重命名Asp.net身份角色

[英]How rename Asp.net Identity Role

我向數據庫添加了3個角色。 "Admin""Moderator""User" 我只想將"Admin"重命名為"Administrator" 我使用此代碼,但其工作不正確。 其返回我錯誤{“數據庫操作應該影響1行,但實際上影響0行。自加載實體以來,數據可能已被修改或刪除。請參閱http://go.microsoft.com/fwlink/ ?LinkId = 527962,以獲取有關了解和處理樂觀並發異常的信息。“}

Edit.cshtml

@model Microsoft.AspNet.Identity.EntityFramework.IdentityRole
    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        @Html.HiddenFor(model => model.Id)
        <div>
            Role name
        </div>
        <p>
            @Html.TextBoxFor(model => model.Name)
        </p>
        <input type="submit" value="Save" />
    }

RoleController

  [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(IdentityRole role) //IdentityRole role
    {
        try
        {

            context.Entry(role).State = EntityState.Modified;
            context.SaveChanges();

            return RedirectToAction("Index");
        }
        catch (Exception ex)
        {
            return View();
        }
    }

使用Identity提供的角色管理器。

在Startup.Auth中,確保像這樣引用RoleManager:

public void ConfigureAuth(IAppBuilder app)
{
    // Add this reference
    app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
}

確保您的Controller包含以下構造函數:

private ApplicationRoleManager _roleManager;
public ApplicationRoleManager RoleManager { get { return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>(); } private set { _roleManager = value; } }

然后,您可以使用它代替問題中的代碼(作為異步代碼):

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit(IdentityRole role)
{
    try
    {
        IdentityRole thisRole = await RoleManager.FindByIdAsync(role.Id);
        thisRole.Name = role.Name;
        await RoleManager.UpdateAsync(thisRole);
        return RedirectToAction("Index");
    }
    catch (Exception ex)
    {
        return View();
    }
}

最后確保您像這樣處理角色管理器:

protected override void Dispose(bool disposing)
{
    if (disposing && RoleManager != null)
    {
        RoleManager.Dispose();
        RoleManager = null;
    }
    if (disposing)
    {
        context.Dispose();
    }
    base.Dispose(disposing);
}

希望這可以解決問題。

這是我的方法。 我的管理頁面的這一部分,選項:“添加/編輯角色”

  [HttpPut]
    public string UpdateRole(RoleModel roleModel)
    {
        string success = "";
        using (var context = new ApplicationDbContext())
        {
            var roleStore = new RoleStore<IdentityRole>(context);
            var storeManager = new RoleManager<IdentityRole>(roleStore);
            IdentityRole thisRole = roleStore.Roles.Where(r => r.Id == roleModel.Id).FirstOrDefault();
            if (thisRole != null)
            {
                thisRole.Name = roleModel.Name;
                IdentityResult result = storeManager.Update(thisRole);
                if(result.Succeeded)
                success = "ok";
                else
                {
                    success = "ERROR";
                    foreach (string error in result.Errors)
                    {
                        success += " :" + error;
                    }
                }
            }
        }
        return success;
    }

您必須使用特殊的RoleManager,我將其內置在ApplicationDbContext的using塊中的storeManager中,以返回所有Roles的列表。 然后,我使用linq where子句查找所需的角色。 然后,通過更改角色名稱並調用.Update來修改角色,該更新也由roleStore StoreManager對象公開。 嘗試直接編輯AspNet用戶文件可以在EntityFramework中完成,並且如果在SQL中完成則只會使事情變得混亂,沒有任何效果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM