【发布时间】:2018-01-19 08:40:24
【问题描述】:
我正在尝试在 EF 应用程序中实现角色。我让它在所有脚手架视图(创建、删除、详细信息)上工作,但无法让 Edit 视图工作。
GET 方法可以正常返回数据(当我进入编辑页面时,我正确地看到了角色):
对象引用未设置为对象的实例。
第 47 行:@Html.Label("Roles", new { @class= "control-label col-md-2" })
第 48 行:
第 49 行:@foreach(Model.RolesList 中的变量项)
第 50 行:{
第 51 行: 选中="@item.Selected" class="checkbox-inline" />
我的Get和Post方法如下:
//
// GET: /Users/Edit/1
public async Task<ActionResult> Edit(string id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var user = await UserManager.FindByIdAsync(id);
if (user == null)
{
return HttpNotFound();
}
var userRoles = await UserManager.GetRolesAsync(user.Id);
return View(new EditUserViewModel()
{
Id = user.Id,
Email = user.Email,
Username = user.UserName,
FirstName = user.FirstName,
LastName = user.LastName,
RolesList = RoleManager.Roles.ToList().Select(x => new SelectListItem()
{
Selected = userRoles.Contains(x.Name),
Text = x.Name,
Value = x.Name
})
});
}
//
// POST: /Users/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit([Bind(Include = "Email,Id,Username,FirstName,LastName")] EditUserViewModel editUser, params string[] selectedRole)
{
if (ModelState.IsValid)
{
var user = await UserManager.FindByIdAsync(editUser.Id);
if (user == null)
{
return HttpNotFound();
}
user.UserName = editUser.Username;
user.Email = editUser.Email;
user.FirstName = editUser.FirstName;
user.LastName = editUser.LastName;
var userRoles = await UserManager.GetRolesAsync(user.Id);
selectedRole = selectedRole ?? new string[] { };
var result = await UserManager.AddToRolesAsync(user.Id, selectedRole.Except(userRoles).ToArray<string>());
if (!result.Succeeded)
{
ModelState.AddModelError("", result.Errors.First());
return View();
}
result = await UserManager.RemoveFromRolesAsync(user.Id, userRoles.Except(selectedRole).ToArray<string>());
if (!result.Succeeded)
{
ModelState.AddModelError("", result.Errors.First());
return View();
}
return RedirectToAction("Index");
}
ModelState.AddModelError("", "Something failed.");
return View();
}
我的观点中有问题的部分是:
<div class="form-group">
@Html.Label("Roles", new { @class = "control-label col-md-2" })
<span class="col-md-10">
@foreach (var item in Model.RolesList)
{
<input type="checkbox" name="SelectedRole" value="@item.Value" checked="@item.Selected" class="checkbox-inline" />
@Html.Label(item.Value, new { @class = "control-label" })
}
</span>
</div>
我在控制器中设置了rolemanager:
private ApplicationRoleManager _roleManager;
public ApplicationRoleManager RoleManager
{
get
{
return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>();
}
private set
{
_roleManager = value;
}
}
这是在我的Startup.auth:
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
我非常有信心 rolemanager 设置正常,因为它成功地恢复了 Create 和 Details 页面上的角色。那为什么是
@foreach (var item in Model.RolesList)
这里出现空引用异常失败?
【问题讨论】:
-
尝试使用@html.checkboxfor()
-
你能发布你的完整视图吗?
标签: entity-framework authorization roles