Foreach返回Model.Roles失败,出现空引用异常

时间:2017-08-10 23:30:54

标签: entity-framework authorization roles

我正在尝试在EF应用程序中实现角色。我有它在所有脚手架视图(创建,删除,详细信息)上工作,但我无法使navigator.webkitTemporaryStorage.queryUsageAndQuota ( function(usedBytes, grantedBytes) { console.log('we are using ', usedBytes, ' of ', grantedBytes, 'bytes'); }, function(e) { console.log('Error', e); } ); 视图工作。

Edit方法返回数据正常(就像我进入编辑页面时我看到角色正确):

enter image description here 但是,如果我进行更改并保存,我会收到错误:

  

对象引用未设置为对象的实例。
  第47行:@ Html.Label(“角色”,新{@class =“control-label col-md-2”})
  第48行:< span class =“col-md-10”>
  第49行:@foreach(Model.RolesList中的var项)
  第50行:{
  第51行:< input type =“checkbox”name =“SelectedRole”value =“@ item.Value”
   checked =“@ item.Selected”class =“checkbox-inline”/>

我的GETGet方法如下:

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); 设置正常,因为它成功恢复了rolemanagerCreate页面上的角色。那么为什么

Details

在这里没有空引用异常?

2 个答案:

答案 0 :(得分:1)

Edit [HttpPost]方法不返回模型:

return View();

应该是

return View(editUser);

此外,您需要确保editUser包含selectedRole属性,否则您将收到相同(或类似)的错误。

否则,像在Get方法中那样创建并返回一个新的EditUserViewModel对象。

答案 1 :(得分:1)

您可以采取的几个步骤

您应该在返回视图上传递模型,以便再次使用ModelState错误加载视图。

return View(editUser);

如果您使用的是c#6或更高版本,那么您可以利用null-conditional operator来避免以下行中的null reference exception

@foreach (var item in Model?.RolesList)

更新

我只是添加错误的控制流“对象引用未设置为对象的实例。” 如果您在ModelState.IsValid上的[HttpPost]上添加了一个断点,您可能会注意到ModelState.IsValid为假。因此,它尝试转到视图,但您没有在方法的最后一行return View();发送模型。现在,视图将null引用到模型中。最后,它在foreach (var item in Model.RolesList)

行上繁荣起来

因此,检查一下,你在ModelState上遇到了什么错误,模型验证是不成功的