1

我正在使用会话来实现购物车。添加到购物车似乎效果很好,但是当我从购物车中删除商品时遇到了问题。当我使用浏览器后退按钮返回上一页然后返回购物车页面时,我再次看到以前删除的项目。我看到有解决方案可以禁用对所有 MVC 项目的缓存,这当然是我不想要的。其他解决方案是将购物车保存到数据库,但这不是一个好的解决方案,因为我允许匿名用户拥有购物车。这是购物车视图中代码的一部分:

   @model Project.Model.ShoppingCart

     foreach (var item in Model._linecollection)
         {
            var totalForProduct=((item.Product.Price / 100.0)*item.Quantity);
            total+=totalForProduct;
        <tr>
            <td>@item.Product.Name</td>
            <td><input class=input-mini type="number" value="@item.Quantity" /></td>
            <td>@(item.Product.Price / 100.0) </td>
             <td>@totalForProduct</td>
             <td>

                @using(Html.BeginForm("RemoveFromCart","Cart",FormMethod.Post,new {@id="form"}))
                {
                <input type="hidden" name="productId" value="@item.Product.Id" class="pToDelete">
                    <button type="submit" class="deleteFromCart">Delete</button>
                }

            </td>
        </tr>
4

1 回答 1

4

出于这个原因,我喜欢在购物车页面上禁用缓存。

您可以使用以下类在 MVC 中执行此操作...

public class NoCacheAttribute : ActionFilterAttribute
{  
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
        filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        filterContext.HttpContext.Response.Cache.SetNoStore();

        base.OnResultExecuting(filterContext);
    }
}

然后你可以将它应用到你的控制器中的一个方法,就像这样......

[NoCache]
public ActionResult Cart()
{
    ...
}

或者我相信在 MVC 3 及更高版本中,您可以使用像这样的内置 OutputCache 属性来禁用缓存......

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")] 
public ActionResult Cart()
{
    ...
}
于 2013-04-25T23:18:55.790 回答