gpt4 book ai didi

entity-framework - Foreach 返回 Model.Roles 因空引用异常而失败

转载 作者:行者123 更新时间:2023-12-04 08:32:45 31 4
gpt4 key购买 nike

我正在尝试在 EF 应用程序中实现角色。我让它处理所有脚手架 View (创建、删除、详细信息),但在获取 Edit 时遇到问题查看工作。
GET方法返回的数据很好(就像当我转到“编辑”页面时,我正确地看到角色一样):

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

Object reference not set to an instance of an object.
Line 47: @Html.Label("Roles", new { @class = "control-label col-md-2" })
Line 48: < span class="col-md-10" >
Line 49: @foreach (var item in Model.RolesList)
Line 50: {
Line 51: < input type="checkbox" name="SelectedRole" value="@item.Value"
checked="@item.Selected" class="checkbox-inline" />



我的 GetPost方法如下:
//
// 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在我的 Controller 中设置:
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)

因空引用异常而失败?

最佳答案

您可以采取的几个步骤

您应该在返回 View 上传递模型以再次加载具有 ModelState 错误的 View 。

return View(editUser);

如果您使用的是 c#6 或更高版本,那么您可以利用 null-conditional operator 避免 null reference exception在下一行
@foreach (var item in Model?.RolesList)

更新

我只是添加了错误的控制流“ 未将对象引用设置为对象的实例。
如果您在 ModelState.IsValid 上添加断点在 [HttpPost] ,您可能会注意到您的 ModelState.IsValid是假的。出于这个原因,它试图转到 View ,但您还没有在方法的最后一行发送您的模型,即 return View(); .现在 View 得到 null引用模型。最后,它上线 foreach (var item in Model.RolesList)
所以检查一下,你在 ModelState 上遇到了什么错误,模型验证不成功

关于entity-framework - Foreach 返回 Model.Roles 因空引用异常而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45624866/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com