【问题标题】:Shopping cart session state done right in ASP.NET MVC购物车会话状态在 ASP.NET MVC 中正确完成
【发布时间】:2011-05-14 00:43:23
【问题描述】:

我正在 ASP.NET MVC 中为未经身份验证的用户实现一个简单的会话购物车,我想把它做好。

过去,我总是将购物车 ID 存储在持久性 Session["CartID"] 存储中并作为 cookie。每当我需要显示购物车时,我都会从我的CartsCartItems 表中查找用户的购物车项目。但在里面我知道一个更强类型的方法会更干净。

在谷歌搜索最新的会话 MVC 资料后,我发现了术语HttpSessionStateWrapper,这似乎是一种可测试的会话处理方式。但是我还没有找到任何好的教程或标准化的实现。也许这只是一个流行词,我应该坚持Session["..."]

在最新版本的 ASP.NET MVC 中使用会话实现购物车的正确方法是什么?

【问题讨论】:

    标签: c# asp.net-mvc session shopping-cart strong-typing


    【解决方案1】:

    MVC 使用 HttpContext 类的可测试和可模拟抽象,称为 HttpContextBase。您根本不需要包装器,并且仍然可以很好地模拟和单元测试您的控制器。

    我在谷歌上找到的第一个例子: http://weblogs.asp.net/andrewrea/archive/2009/08/10/mocking-the-session-object-with-moq-inside-asp-net-mvc-and-having-a-clean-builder-method-for-session-values-in-the-controller.aspx

    【讨论】:

    • 这只是一个模拟会话状态的实现,使用像int pageSize = Session["SpaceController!Index!PageSize"] == null ? 10 : Convert.ToInt32(Session["SpaceController!Index!PageSize"]); 这样的“脏”代码有没有经过尝试和测试的更干净、强类型的方式?
    • 如何模拟取决于您。如何强烈键入会话访问权限取决于您。会话依赖于字符串键并存储对象。在某些时候,您将不得不与这些人合作。我想指出 Asp.net MVC 的主要区别。
    【解决方案2】:

    Steve Sanderson 在他的 Pro ASP.NET MVC 2 Framework 一书中给出了一个很好的例子,说明了如何在 ASP.NET MVC 中使用会话来实现购物车。如果您没有这本书,您可以阅读here 获得灵感。这是一种非常简洁的方法。这个想法是创建一个模型绑定器,从会话中获取购物车。使用购物车的动作将使模型绑定器“注入”购物车。当您测试这些方法时,您的测试应该负责将购物车传递给操作。

    【讨论】:

    • 谢谢,这正是我想要的。
    • @uvita 我喜欢这个想法,但在会话中存储整个购物车不是一个坏主意吗?过去我故意避免这样做,因为我们被告知要保持较小的会话,但如果它得到竖起大拇指,我就会去做。也很好读,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-08-16
    • 2015-07-12
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    相关资源
    最近更新 更多