Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在ASP.NET mvc中使用会话变量仍然可以,或者对于某些东西(如购物车)有更好的替代方案吗_Asp.net Mvc_Asp.net Mvc 3_Session - Fatal编程技术网

Asp.net mvc 在ASP.NET mvc中使用会话变量仍然可以,或者对于某些东西(如购物车)有更好的替代方案吗

Asp.net mvc 在ASP.NET mvc中使用会话变量仍然可以,或者对于某些东西(如购物车)有更好的替代方案吗,asp.net-mvc,asp.net-mvc-3,session,Asp.net Mvc,Asp.net Mvc 3,Session,我有一个情况,我需要访问一个购物车超过几页。 因此,在产品页面上,创建购物车并添加一些项目 在购物车结帐页面上-确认账单地址 在购物车结帐后-做最后一次检查,将购物车添加到DB并开始付款 我的问题是,什么是最好的方式传递车 我曾尝试将购物车从一页传递到另一页,并保持所有值处于活动状态,但是在某些页面(账单地址确认页面)上,这似乎很麻烦,我只想检查账单地址,不想在页面上再次填充购物车 TempData[]是我用于产品签出页面的内容,然后我想知道,在 您可以只使用会话变量吗 出于某种原因,我读到使用

我有一个情况,我需要访问一个购物车超过几页。 因此,在产品页面上,创建购物车并添加一些项目 在购物车结帐页面上-确认账单地址 在购物车结帐后-做最后一次检查,将购物车添加到DB并开始付款

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

我曾尝试将购物车从一页传递到另一页,并保持所有值处于活动状态,但是在某些页面(账单地址确认页面)上,这似乎很麻烦,我只想检查账单地址,不想在页面上再次填充购物车

TempData[]是我用于产品签出页面的内容,然后我想知道,在

您可以只使用会话变量吗

出于某种原因,我读到使用Session并不是很好的做法,因此提出了这个问题


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

使用asp.net mvc应用程序会话非常好。steve sanderson在他的书附带的示例应用程序中使用了cart会话。代码是

我倾向于使用cookie,将我的购物车序列化为
base64字符串
这似乎效果很好

除非有理由避免,否则我会使用Session


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

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

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

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

2) 默认情况下,会话不会持久化,如果您在webfarm上操作,则需要将会话保存在数据库中,以便每个服务器场节点都可以访问。 但看起来你不太可能像这样缩放。如果您满足了扩展的必要性,会话将不是您的首要问题

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

与隐藏输入相比,会话还有一些好处:

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

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


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

会话是好的,但是考虑Amazon风格的系统,即使您没有登录,也可以发布识别cookie。这允许他们将您的购物篮存储在数据库中,并根据识别cookie进行键入


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

对于购物车,您绝对应该不要使用会话状态。一种合理的方法是使用来为您管理cookie。您所需要的只是
web.config
中的一行

<system.web>
    <anonymousIdentification enabled="true" />
</system.web>
这不仅比使用会话状态更有效,而且更简单

参考资料:


在购物车系统中,添加到购物车中的产品非常重要,因此在我看来,使用会话不是一个好主意。在数据库中使用cookies和临时表是最好的方法之一。我们可以永久存储这些数据,也可以在某些天之后清除这些数据

+1-仍然可以使用session,但是需要小心,不要像webforms中那样过度使用session。肥胖治疗仍然不是一件好事。我的意思是在需要的地方使用。正如祖蒂解释的那样,我们不应该过度使用它。cart是使用session的完美方案之一。通过会话变量执行此操作的好处是什么?优点:减少服务器上的存储负载,避免会话超时问题。缺点:HTTP流量增加,需要更多的安全检查来防止恶意篡改cookie数据。还要记住,cookie中存储的数据大小有一个限制:@Zootius说了什么。我不是说你应该这样做,只是给出了另一个选项。事实上,对于启用会话的ASP.NET页面和常规MVC控制器,由于会话锁定,相同的用户HTTP请求是同步的。然而,在MVC 3中,您可以通过使用
SessionState
属性来控制控制器的会话使用特性。例如,完全限制在控制器上使用会话,从而允许异步调用(例如
public ActionResult ShowCartDetails()
{
    var CartId = new Guid(Request.AnonymousID);

    // Lookup cart...

    return View();
}