以下是我的观点中的代码:
@model IEnumerable<Sample2.Models.Leave_GetDetails_Result1>
@{
ViewBag.Title = "Index";
}
<div>
@foreach (var item in Model) {
<dl class="dl-horizontal">
<dt>
@Html.DisplayNameFor(model => model.LA_StaffCode)
</dt>
<dd>
@Html.DisplayFor(model => item.LA_StaffCode)
</dd>
<dd>
@Html.DisplayFor(model => item.LA_AppNo)
</dd>
</dl>
}
</div>
<p>
@*@Html.ActionLink("Edit", "Edit", new { id = Model.Staff_Code }) |*@
@Html.ActionLink("Back to List", "Index")
</p>
当我执行时,它会出错:
"Calling 'Read' when datareader is closed is not a valid operation"
编辑:
Controller代码位于我调用存储过程的位置:
using (var context = new Admin_TestEntities())
{
var data = context.Leave_GetDetails("Recommended");
return View(data.AsEnumerable());
}
答案 0 :(得分:2)
您需要在数据访问层中调用ToList
之类的方法来强制将请求发送到数据库:
using (var context = new Admin_TestEntities())
{
var data = context.Leave_GetDetails("Recommended").ToList();
return View(data);
}
AsEnumerable()
等方法不向数据库发出请求。只有在您第一次访问数据时(在您的情况下 - 在视图中)或显式调用调用数据库的方法(例如ToList()
)时才会发出请求。
您收到错误,因为当您尝试访问视图中的对象时,这是实际调用数据库的时间,但同时您的对象context
已被释放。要修复它,您应该在上下文尚未处理时使用ToList
显式强制数据库查询,即在控制器方法中