Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.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
C# 查看在MVC中单击后丢失的状态数据_C#_Ajax_Session_Model View Controller_Session State - Fatal编程技术网

C# 查看在MVC中单击后丢失的状态数据

C# 查看在MVC中单击后丢失的状态数据,c#,ajax,session,model-view-controller,session-state,C#,Ajax,Session,Model View Controller,Session State,问题背景: 我有一个购物车系统,允许人们更新购物车中每件物品的数量。这是通过一个来自ViewCartContents.cshtml视图的AJAX POST请求,向我的控制器上名为updatealcartitems的方法发出的。所有项目都保存在名为“Cart”的会话变量的列表中 问题: 如果用户将单个项目添加到购物车(即1个单位),然后决定将金额更新为5,则会话列表中存储的购物车项目对象的购物车数量属性将从1更新为5。当用户单击到另一个页面,然后单击购物车的后退按钮,购物车数量金额返回到1而不是5

问题背景:

我有一个购物车系统,允许人们更新购物车中每件物品的数量。这是通过一个来自
ViewCartContents.cshtml
视图的AJAX POST请求,向我的控制器上名为
updatealcartitems
的方法发出的。所有项目都保存在名为“Cart”的会话变量的列表中

问题:

如果用户将单个项目添加到购物车(即1个单位),然后决定将金额更新为5,则会话列表中存储的购物车项目对象的购物车数量属性将从1更新为5。当用户单击到另一个页面,然后单击购物车的后退按钮,购物车数量金额返回到1而不是5时,就会出现问题。我可以确认,如果我刷新页面,那么数量是正确的,因此会话被正确更新,只是看起来视图数据不正确

以下情景显示了该问题

1) 用户将项目添加到购物车:

2) 用户将项目数量更新为5,购物车总额也将更新为5个项目的价格:

3) 用户单击站点上的另一个页面,然后单击返回按钮返回购物车。项目数量已返回到1,并且总数也仅显示1个项目的价格,显然这是不正确的

代码:

AJAX Post请求:

$(".updateCart").click(function () {

    $("tr.item").each(function () {

        var $prodId = $(this).find("td.prodId").html();
        var $prodQty = $(this).find("input").val();

        $.ajax({
            url: '@Url.Action("UpdateAllCartItems")',
            type: 'POST',
            data: {
                "id": $prodId,
                "qty": $prodQty
            },

            success: function (updatedCart) {

                document.getElementById("CartList").innerHTML = "";

                for (var i = 0; i < updatedCart.cartItems.length; i++) {
                    AddItemsToCartDropDown(updatedCart.cartItems[i].CartItemName, updatedCart.cartItems[i].CartItemQty, updatedCart.cartItems[i].CartItemPrice);
                }

                var html = '<span class="pull-left glyphicon glyphicon glyphicon-shopping-cart" id="CartItemsTotal"></span> <b>' + updatedCart.cartItems.length + '</b> item(s) <strong class="caret glyphicon glyphicon-triangle-bottom"></strong>';

                $('#totalCartPrice').html('<h3>Total: £' + updatedCart.cartPrice + '</h3>');

                document.getElementById("CartDropdownHolder").innerHTML = html;

            }

        });

    });
});
$(“.updateCart”)。单击(函数(){
$(“tr.item”)。每个(函数(){
var$prodId=$(this.find(“td.prodId”).html();
var$prodQty=$(this.find(“input”).val();
$.ajax({
url:'@url.Action(“updatealcartitems”),
键入:“POST”,
数据:{
“id”:$prodId,
“数量”:$PRODCTY
},
成功:函数(updatedCart){
document.getElementById(“CartList”).innerHTML=“”;
对于(var i=0;i;
$(“#totalCartPrice').html('Total:£'+updatedCart.cartPrice+”);
document.getElementById(“CartDropdownHolder”).innerHTML=html;
}
});
});
});
购物车控制器上的UpdateAllArtItems方法:

    public ActionResult  UpdateAllCartItems(string id, string qty)
    {
        CartItems = (List<CartItem>)Session["Cart"];

        foreach (var item in CartItems)
        {
            if (item.CartItemId == Convert.ToInt32(id))
            {
                item.CartItemQty = qty;
            }
        }

        CartItems = (List<CartItem>)Session["Cart"];

        string cartTotal = CalculateCartTotal(CartItems);

        Session["Cart"] = CartItems;

        return Json(new {cartItems = CartItems, cartPrice = cartTotal });    
    }
public ActionResult updatealcartitems(字符串id、字符串数量)
{
CartItems=(列表)会话[“购物车”];
foreach(CartItems中的var项)
{
if(item.cartimeid==转换为32(id))
{
item.CartItemQty=数量;
}
}
CartItems=(列表)会话[“购物车”];
字符串cartTotal=CalculateCartTotal(CartItems);
会话[“购物车”]=购物车项目;
返回Json(新的{cartItems=cartItems,cartPrice=cartTotal});
}

如果有人能告诉我如何着手解决这个令人沮丧的问题,我将不胜感激。

在任何时候,当您按下浏览器中的“后退”按钮时,浏览器将加载缓存页面。因此,您看到的只有1个数量的页面是缓存页面。您正在使用javascript在客户端更改数量,浏览器不会缓存该数量

这可以通过为加载页面的MVC操作使用OutputCache属性来克服

通常,OutputCache属性用于通过在浏览器中缓存页面来提高性能。它还可用于控制浏览器执行的缓存。添加具有以下属性的OutputCache属性,浏览器将不会缓存页面,每次单击浏览器中的“上一步”按钮时,它都会向服务器发送一个新请求,以获取包含最新信息的页面

[OutputCache(Duration=0, VaryByParam="none", Location=OutputCacheLocation.Client, NoStore=true)]
public ActionResult Cart()
{
//your code goes here.
}
希望这有帮助

谢谢,
R.Venkatesan

一个解决方案:您可以在(document.ready)块中重新加载ViewCartContents.cshtml中的页面数据。让它对控制器上的某个操作执行AJAX调用,该操作返回页面的数据并填充到客户端。我敢打赌,您的会话正在被其他地方的另一个控制器操作清除。@garryp感谢您的评论。我可以确认会话值是正确的。一旦页面重新加载|(通过点击F5),会话中的正确值就会显示出来。请确保您正在从控制器传递更新的视图数据。仔细检查您的viewmodel!非常感谢,这正是我想要的。我会在一小时内给你赏金