无法编辑IdentityRole

时间:2015-10-01 14:41:01

标签: c# asp.net asp.net-mvc asp.net-mvc-5 asp.net-identity

我有以下观点:

@model Microsoft.AspNet.Identity.EntityFramework.IdentityRole
@{
    ViewBag.Title = Resources.Edit;
}

<h2>@Resources.EditRole</h2>

@Html.ActionLink(Resources.ListRoles, "Index") | @Html.ActionLink(Resources.ManageUserRoles, "ManageUserRoles")
<hr />
<div class="row">
    <div class="col-md-8">
        <section id="editRoleForm">
            @using (Html.BeginForm("Edit", "Role", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
            {
                @Html.AntiForgeryToken()
                <h4>@Resources.Role</h4>
                @Html.ValidationSummary(true, "", new { @class = "text-danger" })
                @Html.HiddenFor(model => model.Id)
                <div class="form-group">
                    @Html.LabelFor(m => m.Name, new { @class = "col-md-2 control-label" })
                    <div class="col-md-10">
                        @Html.TextBoxFor(m => m.Name, new { @class = "form-control" })
                        @Html.ValidationMessageFor(m => m.Name, "", new { @class = "text-danger" })
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">
                        <input type="submit" value="@Resources.Save" class="btn btn-default" />
                    </div>
                </div>
            }
        </section>
    </div>
</div>

我的RoleController中还有以下两种方法:

        //
        // GET: /Role/Edit/5
        public ActionResult Edit(string Role)
        {
            var thisRole = context.Roles.Where(r => r.Name.Equals(Role, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();

            return View(thisRole);
        }

        //
        // POST: /Role/Edit/5
        [HttpPost]
        public ActionResult Edit(FormCollection collection)
        {
            try
            {
                var thisRole = context.Roles.Where(r => r.Id.Equals(collection["Id"])).FirstOrDefault();
                thisRole.Name = collection["Name"];
                context.SaveChanges();
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

最初,我试图使用这种方法而不是第二种方法:

    //
    // POST: /Role/Edit/5
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(IdentityRole Name)
    {
        try
        {
            context.Entry(Name).State = System.Data.Entity.EntityState.Modified;
            context.SaveChanges();

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

但我从来没有让它工作,因为Name参数始终是null - 我仍然不知道为什么会发生这种情况,所以如果有人可以向我解释那将是非常重要的赞赏。

然后我写了另一个方法,因为我在另一个例子中看到FormCollection的使用(创建角色),它似乎工作正常,至少它包含我调试时需要的信息。我的问题是虽然collection["id"]具有我正在尝试编辑的角色的正确ID,但context.Roles完全为空。考虑到调用第一个方法(第一次加载View)时,这对我没有意义,这一行

var thisRole = context.Roles.Where(r => r.Name.Equals(Role, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();

返回所选角色(在我添加到监视context.Roles时可以看到的几个角色中)。但是,在加载视图后,编辑的文本框和控制器中的第二个方法被调用,context.Roles中没有任何内容。为什么呢?

1 个答案:

答案 0 :(得分:0)

好的,您可以使用已内置的[Authorize(Roles="RoleType")]过滤器。

然后您拥有常规用户模型和帐户控制器,以便您可以授权用户。授权后,您可以将其设置为特定角色。

E.g。用户故事:只有管理员可以访问操作结果x

[Authorize(User="Admin")]
Public ActionResult X(){
...
}

这样,您只需在模型创建中分配用户角色。

E.g。

Public Class UserModel
{
int id {get;set;}
string name {get;set;}
string Role {get;set;}
.....
}

现在只有经过授权且属于“管理员”角色类型的用户才能访问该控制器。

如果您想编辑他们的角色,您可以执行简单的编辑用户操作方法

e.g。

    [Post]
    public actionresult edituser(int? id)
    {
    if (id == null)
       {
     return HttpNotFound();
       }

       using (var db = new UserContext())
    {
     UserModel editUser = db.UserModel.Find(id);
     if (editUser == null)
    {
    return HttpNotFound();
    }

db.User(editModel).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges();
}
RedirectToAction("Action", "Controller");
}

现在,任何不属于角色类型“Admin”的用户将无法访问该屏幕。他们将收到404错误。