我有以下观点:
@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
中没有任何内容。为什么呢?
答案 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错误。