MVC - 我如何在布局和视图中共享模型
我们有一个复杂的购物车结构。复杂性在于定价结构。需要大量不同的数据库实体来计算所有的定价。由于其复杂性,我们仅为每个客户的购物车存储少量数据,而当我们需要购物车时,我们会读取所有这些购物车数据以及数据库中的许多定价部分 - (编辑)并将结果写入购物车物品,完成总计。这不幸的是在时间上相对昂贵。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
您可以在购物车实例存储到HttpContext.Items
字典,以便它在整个HTTP请求生命周期中都可用,并避免在相同的数据中击中数据库两次。
谢谢!我只是尝试过,它适用于我。我正在使用Session,但会话在请求中持续存在的方式对我来说存在问题。 – Cary 2013-02-18 22:42:50
如果关于我们的页面需要它,然后在控制器中计算它。你已经知道你需要它,所以在视图被调用之前做好它。 – jcolebrand 2013-02-18 19:52:47
jcolebrand - 感谢您的回复。如果页面需要它,我可以在控制器中进行计算,然后将购物车传送到视图中,然后视图可以将购物车传递到布局中。但是,如果网页不需要它,那么布局如何获得购物车的副本?另外,如果在别的地方需要它,我该如何移动它?我的问题是:是否有一种方法可以仅按请求实例化,然后使其具有“全局”可用性? – Cary 2013-02-18 21:27:40
对于您所描述的内容,我会将其视为“放入基本控制器”。 – jcolebrand 2013-02-18 23:06:35