我正在尝试在mvc5视图中为特定模型属性执行循环但是我收到错误:
附加信息:ObjectContext实例已被释放,不能再用于需要连接的操作 .
这是我的观点:
@using App.Models
@model App.Portal.WebUI.Models.ManageViewModel
@{
ViewBag.Title = "Edit";
}
<h2>Edit</h2>
<div class="container">
<div class="col-md-9">
<div class="col-md-12">
<div class="form-group">
@Html.LabelFor(m => m.AUser.Id)
<label>@Html.DisplayFor(m => m.AUser.Id)</label>
</div>
<div class="form-group">
@Html.LabelFor(m => m.AUser.FirstName)
@Html.TextBoxFor(m => m.AUser.FirstName)
</div>
<div class="form-group">
@Html.LabelFor(m => m.AUser.PhoneNumber)
@Html.TextBoxFor(m => m.AUser.PhoneNumber)
</div>
<div class="form-group">
</div>
</div>
<div class="col-md-12">
<div class="form-group"> </div>
<div class="form-group">
@Html.LabelFor(m => m.AUser.LastName)
@Html.TextBoxFor(m => m.AUser.LastName)
</div>
<div class="form-group">
@Html.LabelFor(m => m.AUser.Email)
@Html.TextBoxFor(m => m.AUser.Email)
</div>
</div>
</div>
<div class="col-md-3">
@foreach (AspNetRole userRole in Model.AUser.AspNetRoles)
{
@Html.CheckBox(userRole.Name, true)
@Html.Label(userRole.Name)
}
</div>
</div>
该错误发生在foreach循环中 .
知道我做错了什么吗?
非常感谢,Laziale
更新(增加代码):
ManageViewModel model = new ManageViewModel();
if (id.HasValue)
{
using (var db = new DbContext())
{
AspNetUser user = (from p in db.AspNetUsers
where p.Id == id
select p).First();
model.AUser = user;
List<AspNetRole> roles = (from r in db.AspNetRoles
select r).ToList();
model.RoleList = roles;
}
}
2 回答
不要在ViewModel中使用连接到数据库的实体!决不!!它会导致您刚刚遇到的问题 . 单独的图层 . 了解关注点分离separation of concerns
我没有看到你如何填充Model类的猜测是
AspNetRoles
的查询实际上还没有被执行,并且当你开始使用foreach
迭代列表时这样做了 . db上下文已放置在控制器中,因此无法再在该点获取列表结果 .当您在控制器中填充模型数据时,请尝试在填充AspNetRoles的查询末尾执行
.ToList()
,这将立即执行查询 . 希望这可以帮助!