如何从控制器加载导航子项以查看

时间:2018-05-08 12:45:51

标签: c# asp.net asp.net-mvc-5

将导航(子)元素从控制器加载到视图时遇到问题

我创建了这个模型

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>

1 个答案:

答案 0 :(得分:1)

虽然评论建议使用视图模型,这是一个好主意,但代码的基本问题是数据库上下文的生命周期。

执行以下代码时:

myModel.Supports = new SupportW().GetSupports(useremail);

对象SupportW具有该语句的生命周期。它可能会在您的视图执行之前被处理掉。如果方法GetSupports(useremail)返回IQueryable,那么当在视图中解析时,源不再存在。

要解决此问题,您应将行更改为:

myModel.Supports = new SupportW().GetSupports(useremail).ToList();

添加ToList()会立即解析`IQueryable',数据将在您的视图中显示。