仍然可以在ASP.NET mvc中使用Session变量,或者是否有更好的替代方法(如购物车)

Kee*_*eno 37 asp.net-mvc session asp.net-mvc-3

我有一种情况,我需要访问几个页面上的购物车.因此,在产品页面上 - 创建购物车添加一些项目在购物车结帐页面 - 确认帐单地址在购物车结帐帖子 - 做最后检查,添加购物车到数据库,然后去付款

我的问题是,什么是最好的方式绕过购物车?

我已经尝试将购物车从页面传递到回发并保持所有值仍然存在,但是在某些页面(帐单地址确认页面)这看起来很麻烦,我想要检查的是帐单地址并且真的不想要吨在页面上的HiddenFor()再次填充购物车

TempData []是我用于产品结账页面的内容,然后想知道最好继续设置TempData ....

你可以使用会话变量吗?

出于某种原因,我读到了使用Session的不太好的做法,因此问题.

感谢您的指导,如果您认为有用,我很乐意提供一些代码/更多信息.

Zru*_*uty 57

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

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

1)会话阻止用户从多个浏览器选项卡正确浏览您的站点,在一个选项卡中进行的更改将反映在所有其他选项卡中.但是通过购物车,它正是您所需要的.你不需要每个用户购买几个购物车,对吗?

2)默认情况下会话不会保留,如果您在webfarm上运行,则需要将数据库中的会话保存为每个服务器场节点都可以访问.但你似乎不太可能像这样扩展.如果您满足扩展需求,会话将不是您的首要问题.

3)会话需要用户浏览器的其他功能(通常是cookie).但现代浏览器都支持cookie,所以你只需要担心非常特殊的浏览器.

会话对隐藏输入也有一些好处:

1)开销较小.只有一个小会话cookie在您和客户端之间来回传递,而不是完整的隐藏输入集.

2)编程更简单.您不必确保在每个页面中都包含隐藏的输入.

3)安全.客户可以随意更改隐藏输入的内容.您无法通过隐藏的输入轻松传递敏感信息,您需要对其进行加密.会话值存储在服务器上,因此客户端无权访问它们.


Jam*_*ack 11

会话很好,但考虑到亚马逊风格的系统,即使您没有登录,也会向您发送识别cookie.这允许他们将您的购物篮存储在数据库中,与识别cookie密钥相关.

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


Muh*_*hid 10

使用asp.net mvc应用程序的会话非常好.史蒂夫桑德森在他的书中附带的示例应用程序中使用了购物车会话.代码可在此处获得

  • +1 - 可以使用会话,但需要注意不要过度使用它,就像webforms中的标准一样.胖子会议仍然不是一件好事. (2认同)

Pal*_*tir 5

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

例如,我有一个项目,我在后台重复调用MVC操作.此操作为文件提供服务,该文件在网络上较慢.我曾经使用Session,但我很快发现了主要的不利影响:IIS不会并行执行来自同一用户的调用,而只是依次顺序执行.这对性能产生了巨大影响,因此我使用了另一种方法:将HttpContext.User.Identity设置为用户名,并将其用作从数据库中获取内容的密钥.但你可以将它设置为一些随机的GUID并将其替换为Sessions.

  • 确实,对于启用了Session的ASP.NET页面和通用MVC控制器,由于会话锁定,同一用户HTTP请求会同步.但是在MVC 3中,您可以使用`SessionState`属性来控制Controller的会话使用特性.例如,要完全限制在控制器上使用会话,从而允许异步调用(例如,对于AJAX轮询或文件服务),您将使用`[SessionState(System.Web.SessionState.SessionStateBehavior.Disabled)]`.欲了解更多信息:http://tech-journals.com/jonow/2011/10/22/the-downsides-of-asp-net-session-state (4认同)