2

Cookie のすべてのコンテンツを消去しているのか、それともユーザーから既存の Cookie を取得せずに追加して戻しているのかはわかりません。

コードは次のとおりです。

[Authorize]
public ActionResult AddToCart(int productId, int quantity)
{
    //If the cart cookie doesn't exist, create it.
    if (Request.Cookies["cart"] == null)
    {
        Response.Cookies.Add(new HttpCookie("cart"));
    }

    //If the cart already has this item, add the amount to it.
    if (Request.Cookies["cart"].Values[productId.ToString()] != null)
    {
        int tmpAmount = Convert.ToInt32(Request.Cookies["cart"].Values[productId.ToString()]);
        Response.Cookies["cart"].Values.Add(productId.ToString(), (quantity + tmpAmount).ToString());
    }
    else
    {
        Response.Cookies["cart"].Values.Add(productId.ToString(), quantity.ToString());
    }

    return RedirectToAction("Index");
}

私はブレークポイントを使用しており、Cookie にアイテムがあり、別の別のアイテムを追加すると、コードが正しく実行されないことを確認できResponse.Cookies.Add(new HttpCookie("cart"));ます。だから私は新しいクッキーを作成しているとは思わない.

実際、同じアイテムを追加しようとしましたが、そのアイテムを 2 回リストするのではなく、そのアイテムの金額が増加していることを正しく確認しています。

私の問題は、既存の Cookie への書き込みにあると思いますか?

別のアイテムを追加した後の期待される結果:

かごページで 2 つのアイテムを表示します。

実結果:

バスケット ページに追加した最新のアイテムのみを表示します。

明らかな間違いはありますか?これはクッキーへの私の最初の進出です。

4

2 に答える 2

2

毎回新しい Cookieを作成し、必要なすべての値を追加してみてください (既存の値を新しい Cookie に読み取ってから、新しい値を追加します)。

MSDN ドキュメントからhttp://msdn.microsoft.com/en-us/library/ms178194.aspx

Cookie を直接変更することはできません。代わりに、Cookie の変更は、新しい値で新しい Cookie を作成し、その Cookie をブラウザーに送信して、クライアントの古いバージョンを上書きすることで構成されます。

また、Cookie をユーザーのハード ドライブに保存しますか? その場合、Cookie に有効期限を設定する必要があります。

于 2012-04-06T04:58:06.140 に答える
0

次のコードを使用して、これを解決できました。

キーに単一の値を追加すると、残りの値が消えてしまったようです。私が行ったことは、既存の Cookie と、間もなく追加される productId および amount を受け取るヘルパー メソッドを作成することでした。

以下は私がそれを呼び出す方法です。

[Authorize]
public ActionResult AddToCart(int productId, int quantity)
{
    //If the cart cookie doesn't exist, create it.
    if (Request.Cookies["cart"] == null)
    {
        Response.Cookies.Add(new HttpCookie("cart"));
    }

    //Helper method here.
    var values = GenerateNameValueCollection(Request.Cookies["cart"], productId, quantity);
    Response.Cookies["cart"].Values.Add(values);

    return RedirectToAction("Index");
}

そして、ここにそのヘルパーメソッドがあります:

private NameValueCollection GenerateNameValueCollection(HttpCookie cookie, int productId, int quantity)
{
    var collection = new NameValueCollection();
    foreach (var value in cookie.Values)
    {
        //If the current element isn't the first empty element.
        if (value != null)
        {
            collection.Add(value.ToString(), cookie.Values[value.ToString()]);
        }
    }

    //Does this product exist in the cookie?
    if (cookie.Values[productId.ToString()] != null)
    {
        collection.Remove(productId.ToString());
        //Get current count of item in cart.
        int tmpAmount = Convert.ToInt32(cookie.Values[productId.ToString()]);
        int total = tmpAmount + quantity;
        collection.Add(productId.ToString(), total.ToString());
    }
    else //It doesn't exist, so add it.
    {
        collection.Add(productId.ToString(), quantity.ToString());
    }

    if (!collection.HasKeys())
        collection.Add(productId.ToString(), quantity.ToString());

    return collection;
}
于 2012-04-06T15:14:11.173 に答える