将导航(子)元素从控制器加载到视图时遇到问题
我创建了这个模型
public class MultipleItems
{
public IEnumerable<Order> Orders { get; set; }
public IEnumerable<support> Supports { get; set; }
public IEnumerable<DbModel.Track> Tracks { get; set; }
public IEnumerable<Receipt> Receipts { get; set; }
public IEnumerable<Quota> Quotas { get; set; }
}
和控制器
public ActionResult Client()
{
string useremail = User.Identity.GetUserName();
var myModel = new MultipleItems();
myModel.Supports = new SupportW().GetSupports(useremail);
myModel.Orders = new Orders().GetOrders(useremail);
myModel.Receipts = new Receipts().GetReceipts(useremail);
myModel.Tracks = new Track().GetTracks(useremail);
myModel.Quotas = new Quotas().GetQuota(useremail);
return View(myModel);
}
对Tracks()
感兴趣,这是方法
public IEnumerable<DbModel.Track> GetTracks(string email)
{
try
{
using (var da = new CourierEntities())
{
da.Tracks.Include(a => a.Order);
da.Tracks.Include(a => a.Order.User);
da.Tracks.Include(a => a.destination);
da.Tracks.Include(a => a.Source);
da.Tracks.Include(a => a.CurrentLocation);
var q = (from p in da.Tracks where p.Order.User.Email == email select p).ToList();
if (q != null)
{
return q;
}
}
return null;
}
catch (Exception ex)
{
returnMsg = ex.Message;
return null;
}
}
虽然视图是
<td>
@if (Model.Orders.Count() != 0)
{
foreach (var i in Model.Tracks)
{
<tr>
Order id @i.OrderID
<br />
Trackid @i.TrackID
<br />
@i.Order.Packagename
</tr>
}
}
</td>
遇到@ i.Order.Packagename问题,我收到此错误
ObjectContext实例已被释放,无法再使用 需要连接的操作。
描述:执行期间发生了未处理的异常 当前的网络请求。请查看堆栈跟踪了解更多信息 有关错误的信息以及它在代码中的起源。
异常详细信息:System.ObjectDisposedException:ObjectContext 实例已被处理,不能再用于 需要连接的操作。
Source Error: Line 120: Line 121: <br /> Line 122: @i.Order.Packagename Line 123: </tr>
答案 0 :(得分:1)
虽然评论建议使用视图模型,这是一个好主意,但代码的基本问题是数据库上下文的生命周期。
执行以下代码时:
myModel.Supports = new SupportW().GetSupports(useremail);
对象SupportW
具有该语句的生命周期。它可能会在您的视图执行之前被处理掉。如果方法GetSupports(useremail)
返回IQueryable
,那么当在视图中解析时,源不再存在。
要解决此问题,您应将行更改为:
myModel.Supports = new SupportW().GetSupports(useremail).ToList();
添加ToList()
会立即解析`IQueryable',数据将在您的视图中显示。