仍然可以在ASP.NET MVC中使用会话variables,或者有一些更好的select(如购物车)

我有一种情况,我需要访问购物车多页。 因此,在产品页面上 – 创build购物车,并添加一些项目在购物车结帐页面 – 确认帐单地址在购物车结帐后 – 做一个最后的检查,添加购物车数据库,并去付款

我的问题是,什么是最好的方式来传递车?

我已经尝试从购物车页面回传,并保持所有的价值活着,但是在一些页面(帐单地址确认页面)这似乎很麻烦,我要检查的是我的帐单地址,并不真正想要吨页面上的HiddenFor()再次填充购物车

TempData []是我用于产品结帐页面,然后想知道是最好的时刻始终保持设置TempData ….

你可以只使用会话variables?

出于某种原因,我读了它不是很好的练习使用会话,因此,这个问题。

感谢您的指导,如果您认为它有帮助,我可以开心地提供一些代码/更多信息。

在ASP.NET MVC中使用会话完全可以,特别是在您的购物车场景中。

使用会话有一些缺点,但似乎并不适用于您的情况:

1)会话阻止用户从多个浏览器选项卡中正确浏览您的网站,一个选项卡中所做的更改将反映在其他所有选项中。 但购物车,这正是你所需要的。 你不需要每个用户几个购物车,是吗?

2)会话不是默认持久的,如果你在一个webfarm上运行,你需要将会话保存在你的数据库中,以供每个场节点访问。 但是你看起来不太可能像这样缩放。 如果您满足扩展需求,会议将不会成为您的首要问题。

3)会话需要来自用户浏览器的附加function(通常是cookies)。 但现代浏览器都支持cookies,所以你只需要担心非常特殊的浏览器。

会话隐藏input也有一些好处:

1)较小的开销。 只有一个小会话cookie在你和客户端之间来回传递,而不是一整套隐藏的input。

2)更简单的编程。 你不必确定你的隐藏input包含在你的每一页中。

3)安全。 客户可以改变隐藏input的内容,但他喜欢。 您无法通过隐藏的input轻松传递敏感信息,您需要对其进行encryption。 会话值存储在服务器上,所以客户端无法访问它们。

使用与asp.net mvc应用程序的会话是非常好的。 史蒂夫·桑德森(Steve Sanderson)在他的书中附带的示例应用程序中使用了会话。 代码在这里可用

会话是好的,但考虑到亚马逊式的系统,即使你没有login,你也可以得到一个识别cookie。这使得他们可以将你的购物篮存储在数据库中,并将其粘贴在识别cookie上。

结果就是避免了由于会话超时/服务器应用程序域回收而导致丢失购物篮的可怕的用户体验(后者通过使用我推荐的SQLState会话存储缓解)。 用户可以在几天后回来,他们的篮子仍然在那里。 除非这是一个安全/隐私问题,否则我认为这是更好的解决scheme。

我会使用Session,除非有理由避免它。

例如,我有一个项目,我在后台反复调用MVC操作。 这个动作提供一个文件,在networking上很慢。 我曾经使用Session,但是我很快发现了主要的不利影响:IIS不会同时执行来自同一个用户的调用,而只是依次执行。 这对性能产生了巨大的影响,所以我使用了另一种方法:将HttpContext.User.Identity设置为用户名,并将其用作从数据库中获取内容的键。 但是你可以把它设置成一些随机的GUID,并且用这个replaceSessions。

我倾向于使用一个cookie与我的购物车序列化成base64 string这似乎工作得很好

对于购物车,你绝对应该使用会话状态 。 一个合理的方法是使用匿名识别模块为您pipe理一个cookie。 所有你需要的是web.config一行。

 <system.web> <anonymousIdentification enabled="true" /> </system.web> 

然后,在每个请求上,您可以使用Request.AnonymousID属性(返回一个代表GUID的string)来查找数据库中的购物车。

 public ActionResult ShowCartDetails() { var CartId = new Guid(Request.AnonymousID); // Lookup cart... return View(); } 

这不仅比使用会话状态更有效率,而且更简单。

参考文献: