2013-02-18 55 views
0

我们有一个复杂的购物车结构。复杂性在于定价结构。需要大量不同的数据库实体来计算所有的定价。由于其复杂性,我们仅为每个客户的购物车存储少量数据,而当我们需要购物车时,我们会读取所有这些购物车数据以及数据库中的许多定价部分 - (编辑)并将结果写入购物车物品,完成​​总计。这不幸的是在时间上相对昂贵。MVC - 我如何在布局和视图中共享模型

我们的主站点布局(编辑)获取购物车对象并显示购物车的链接,并显示应付金额,如果购物车中有任何物品。

我们的网页可能会显示或不显示购物车中的其他信息。例如,“关于我们”页面不需要购物车,但网站布局仍然需要它。

我为购物车设置了一个全局对象。我可以从主站点布局访问该对象。我也可以把它放到页面的视图模型中。

因此,有时主站点布局实例化购物车,并且视图模型独立实例化购物车。

(编辑)因此,网站布局需要每个网页的购物车对象 - 而且网页可能不需要购物车对象。

问题:该视图可能有也可能没有可放入ViewBag的购物车,因此主站点布局可以使用它。我如何才能在生命周期中实例化购物车对象一次?

public class ShoppingCart 
{ 
    // Complex, data intensive calculations upon instantiation 
} 

public class myViewModel 
{ 
    public ShoppingCart cart {get; set;} 
} 

在主站点布局:

@{ 
    ShoppingCart cart = new ShoppingCart(GlobalMemberID); 
} 

在需要购物车页面:

@model myViewModel 
+0

如果关于我们的页面需要它,然后在控制器中计算它。你已经知道你需要它,所以在视图被调用之前做好它。 – jcolebrand 2013-02-18 19:52:47

+0

jcolebrand - 感谢您的回复。如果页面需要它,我可以在控制器中进行计算,然后将购物车传送到视图中,然后视图可以将购物车传递到布局中。但是,如果网页不需要它,那么布局如何获得购物车的副本?另外,如果在别的地方需要它,我该如何移动它?我的问题是:是否有一种方法可以仅按请求实例化,然后使其具有“全局”可用性? – Cary 2013-02-18 21:27:40

+0

对于您所描述的内容,我会将其视为“放入基本控制器”。 – jcolebrand 2013-02-18 23:06:35

回答

1

您可以在购物车实例存储到HttpContext.Items字典,以便它在整个HTTP请求生命周期中都可用,并避免在相同的数据中击中数据库两次。

+0

谢谢!我只是尝试过,它适用于我。我正在使用Session,但会话在请求中持续存在的方式对我来说存在问题。 – Cary 2013-02-18 22:42:50

相关问题