web-dev-qa-db-ja.com

ASP.NET mvcでセッション変数を使用してもかまいません。

複数のページからショッピングカートにアクセスする必要がある状況があります。したがって、製品ページで-カートを作成していくつかのアイテムを追加しますカートのチェックアウトページで-請求先住所を確認しますカートのチェックアウトポストで-最終チェックを行い、DBにカートを追加して支払いに進みます

私の質問は、カートを渡すための最良の方法は何ですか?

私はカートをページからポストバックに渡してすべての値を維持することを試みましたが、一部のページ(請求先住所の確認ページ)ではこれは非常に面倒なようです。ページのHiddenFor()を使用して、カートに再度データを入力します

TempData []は、製品のチェックアウトページで使用したものです。

あなただけのセッション変数を使用できますか?

どういうわけか、Sessionを使用するのはあまり良い習慣ではないので、質問をしました。

あなたのガイダンスをありがとう、あなたがそれが役に立ったと思うなら、私はいくつかのコード/詳細情報を喜んで提供できます。

37
Keeno

ASP.NET MVCでセッションを使用することは、特にあなたのショッピングカートのシナリオではまったく問題ありません。

セッションの使用には欠点がありますが、ケースには当てはまらないようです。

1)セッションにより、ユーザーは複数のブラウザタブからサイトを適切に閲覧できなくなります。1つのタブで行った変更は他のすべてのタブに反映されます。しかし、ショッピングカートがあれば、まさにそれが必要です。ユーザーごとに複数のショッピングカートは必要ありません。

2)セッションはデフォルトでは保持されません。webfarmで操作している場合、すべてのファームノードからアクセスできるように、データベースにセッションを保存する必要があります。しかし、このようにスケーリングしている可能性は低いようです。また、スケーリングの必要性を満たす場合、セッションは最大の問題にはなりません。

3)セッションには、ユーザーのブラウザーからの追加機能(通常はCookie)が必要です。しかし、最新のブラウザーはすべてCookieをサポートしているため、特別なブラウザーについてのみ心配する必要があります。

非表示の入力に対するセッションの利点もいくつかあります。

1)オーバーヘッドが小さい。非表示の入力の完全なセットではなく、小さなセッションCookieのみがユーザーとクライアントの間でやり取りされます。

2)よりシンプルなプログラミング。すべてのページに非表示の入力が含まれていることを確認する必要はありません。

3)セキュリティ。クライアントは隠し入力の内容を変更できますが、好きなように変更できます。非表示の入力を介して機密情報を簡単に渡すことはできません。暗号化する必要があります。セッション値はサーバーに格納されるため、クライアントはそれらにアクセスできません。

58
Zruty

セッションは問題ありませんが、ログインしていない場合でも認識Cookieが発行されるAmazonスタイルのシステムを検討してください。これにより、認識Cookieをキーとして買い物かごをデータベースに保存できます。

その結果、セッションタイムアウトやサーバーアプリドメインのリサイクルが原因で買い物かごを失うという恐ろしいユーザーエクスペリエンスを回避できます(後者は、推奨されるSQLStateセッションストレージを使用することで軽減されます)。ユーザーは数日後に戻ってくることができ、バスケットはまだそこにあります。それがセキュリティ/プライバシーの問題でない限り、私はそれがより良い解決策だと思います。

11
James McCormack

Asp.net mvcアプリケーションでセッションを使用しても問題ありません。 steve sandersonは、本に付属するサンプルアプリケーションでカートのセッションを使用しました。コードは ここで利用可能 です。

10

回避する理由がない限り、私はセッションを使用します。

たとえば、MVCアクションへの呼び出しをバックグラウンドで繰り返しているプロジェクトが1つあります。このアクションは、ネットワーク経由で遅いファイルを提供します。以前はSessionを使用していましたが、主な悪影響をすぐに発見しました:IISは同じユーザーからの呼び出しを並行して実行するのではなく、順番に実行するだけです。これは劇的な影響を与えましたパフォーマンス上、別の方法を使用しました:HttpContext.User.Identityをユーザー名に設定し、それをキーとして使用してデータベースから情報を取得します。ただし、ランダムに設定することもできますGUIDそして、これでセッションを置き換えることができます。

5
Palantir

ショッピングカートの場合、セッション状態を使用しないでください。健全なアプローチは 匿名識別モジュール を使用してCookieを管理することです。必要なのは、web.configの1行だけです。

<system.web>
    <anonymousIdentification enabled="true" />
</system.web>

次に、各リクエストでRequest.AnonymousIDプロパティ(GUIDを表す文字列を返す)を使用して、データベース内のショッピングカートを検索できます。

public ActionResult ShowCartDetails()
{
    var CartId = new Guid(Request.AnonymousID);

    // Lookup cart...

    return View();
}

これは、セッション状態を使用するよりも効率的であるだけでなく、より簡単です。

参照:

4
NightOwl888

ショッピングカートをbase64 stringにシリアル化してCookieを使用する傾向がありますが、これはかなりうまくいくようです

2
simonlchilds

カートシステムでは、カートに追加される製品は非常に重要であるため、セッションを使用することは私の考えでは良い考えではありません。データベースでCookieと一時テーブルを使用することは、最良のアイデアの1つです。これらのデータは永久に保存することも、特定の日後に消去することもできます。

0
Ujwal Neupane