0

音楽のジャンルごとに形成された配列リストがあります。たとえば、カントリー ミュージックを表示します。

public class CountryItemList
{
    ArrayList CountryItems = new ArrayList();

    protected void CountryBuy1_Click(object sender, ImageClickEventArgs e)
    {
        CountryItems.Add("Johnny Cash - I Walk The Line - $9");
    }
    protected void CountryBuy2_Click(object sender, ImageClickEventArgs e)
    {
        CountryItems.Add("Carrie Underwood - Blown Away - $9");
    }
    protected void CountryBuy3_Click(object sender, ImageClickEventArgs e)
    {
        CountryItems.Add("Keith Urban - The Story So Far - $9");
    }

    protected void CountryBuy5_Click(object sender, ImageClickEventArgs e)
    {
        CountryItems.Add("Taylor Swift - Red - $11");
    }
    protected void CountryBuy6_Click(object sender, ImageClickEventArgs e)
    {
        CountryItems.Add("Willie Nelson - Legend - $9");
    }

}

}

クリックされた購入ボタンごとに、選択されたアルバムが配列リストに追加されます。それ以降、配列リストをセッションに取り込み、「ショッピング カート ページ」のリスト ボックスに移動したいと考えています。配列リストを取得して次のページに持ち越すためのセッションにするのに問題があります

4

4 に答える 4

1

私は、このような目的で Session を使用することに常に熱心ではありませんでした。特にショッピングカートのようなものでは、データベーステーブルを使用するほど信頼性が低いことがわかりました.

アプリケーション プールを再起動する必要が生じた場合、それをセッションに保存すると、現在のユーザーの選択が失われます。また、Session に何かを入れると、すぐに利用できると考えるべきではありません。

このようなものをデータベース テーブル内に格納することを検討する必要があります。各ユーザーが初めて何かをカートに追加するときに GUID を割り当て、それを各曲の製品 ID に加えて使用できます。その GUID を Cookie に入れると、後で戻ってきてもカートがいっぱいになります。Cookie を使用したくない場合や、ウィンドウを閉じたときにカートが空であることを気にしたくない場合は、SessionID を使用することもできます。

セッションを引き続き使用する場合は、次のようなものが機能します

    protected List<string> SelectedSongs
    {
        get
        {
            List<string> li = new List<string>();

            if (Session["SelectedSongs"] != null)
            {
                try
                {
                    return (List<string>)Session["SelectedSongs"];
                }
                catch (Exception e)
                {
                    return li; // Something went wrong?  Return the empty list.
                }
            }
            else
            {
                return li;
            }
        }
        set
        {
            Session["SelectedSongs"] = value;
        }
    }

それらをリストに追加するために、イベント ハンドラーを 1 つだけ使用することで、コードを少しきれいにすることができます。このようなもの

protected void AddToCart(object sender, CommandEventArgs e)
{
     List<string> li = SelectedSongs;
     li.Add(e.CommandArgument )
     SelectedSongs = li;    
}

<asp:Button id="btnAddToCart"  Text="Add Song" CommandArgument="Johnny Cash - I Walk The Line - $9" CommandName="AddToCart" runat="server"/>

<asp:Button id="btnAddToCart"  Text="Add Song" CommandArgument="Carrie Underwood - Blown Away - $9" CommandName="AddToCart" runat="server"/>

他の曲についても同様です。

于 2013-04-04T20:22:28.480 に答える
1

それを引き継ぐには、Session[] を使用する必要があります。

ArrayList ではなく List を使用します。

次のようなものを試してください:

private List<string> _countryItems;
        public List<string> CountryItems {
            get {
                if (_countryItems == null) {
                    _countryItems = (List<string>)Session["CountryItems"];
                    if (_countryItems == null) {
                        _countryListItems = new List<string>();
                        Session["CountryItems"] = _countryItems;
                    }
                }
                return _countryItems;
            }
            set { _countryItems = value; }
        }

        protected void CountryBuy6_Click(object sender, ImageClickEventArgs e) {
            CountryItems.Add("Willie Nelson - Legend - $9");
        }

このようにして、CountryListItems をセッションから直接参照します。セッションに存在する場合は、セッションから値を取得します。そうでない場合は、値を追加できる空のリストを取得します。これにより、要素を追加すると、セッションへの更新がコミットされます。

また、複数の場所から呼び出される単一のクリック イベントを作成できる CommandEventArgs の使用を検討すると、個々のコメント イベント引数を e に送信して、マークアップから値を取得できます。

于 2013-04-04T19:49:10.993 に答える