7

ASP.NET MVC アプリケーションで Session をどのように使用すればよいかについての考えを探していますか? 特にマスターページを使用して、コントローラーをバイパスせずにマスターページにデータを取得しようとする場合。この質問は、私が多くの小さな質問をすることから始まりましたが、まだ実装していませんが、ある程度実行可能なソリューションに形作ることができました。フィードバックをいただければ幸いです。


私の提案する解決策は、別名「誰かがやめろと言わない限り、私が実装しようとしているもの」です。

ModelBase から継承するモデル クラスがあります。これには、マストヘッドまたはフッターに表示される特定のものと、ログインしているユーザーに基づく構成主導の設定について、マスターページ (ページごとに 1 つのビューしかありません) に必要な情報が含まれています。

私の最善の解決策は次のとおりです-「製品ページ」についてここに示します:

仮定: ある時点で、セッション内の特定のデータを既にスタックしていpartnerIdますcurrentLoggedInUserEmail

私はすべてのモデルが継承するModelBaseクラスを持っていますProductModel

MySiteControllerBaseクラス(コントローラーから継承)があります-これはによってサブクラス化されますProductController

私のアクション メソッドでは、ProductControllerを使用して製品ビューのモデルを作成します'new ProductModel()'。このモデル クラス自体は、セッションやデータの入力方法について何も知りませんModelBase。それは基本的に何も知りませんModelBase- それから継承するだけです。連鎖コンストラクターは何もしません (渡したくないためSession)。

モデル パラメーターを受け取るすべてのオーバーロードをオーバーライドView(...)します。MySiteControllerBaseそのパラメーターが型であるかどうかを確認し、型である場合はやModelBaseなどのプロパティを入力します。幸いなことに、私はから継承するクラスの中にいるので、直接アクセスできるので、そこから直接それらを引き出すことができます。partneridcurrentLoggedInuserEmailControllerSession

このメソッドは、ModelBase私が'return View(model)'. ProductModelただし、 のモデルが で定義されたものにアクセスする必要がある場合は、明らかな問題がありますModelBase。まだ入力されていないため、null になります。

この問題は、コンストラクター チェーンを介して に渡すSessionことで解決できます。モデルを、外部データ構造についてまったく知らないはずのかなりばかげたデータ構造と考えるのが好きなので、私はそのソリューションが本当に好きではありませ。別の解決策は、それを翼にすることかもしれません。その中で定義されたものを消費する必要があることがわかった場合は、メソッドを作成して、内部に明示的に入力します。それが明確であることを願っています!new ProductModel(session)new ModelBase(session)ProductControllerModelBaseMySiteControllerBase.UpdateModelBase(productModel, session)ProductController

頭に浮かぶ他の質問は次のとおりです。

  • 単体テストはどうですか?MVC のセッション状態に関する抽象化はありますか?それとも独自に構築する必要がありますか? ソースコードで「セッション」を検索しましたが、何も表示されませんでした。
  • セッション トラッキングは MVC の /REST/FUL/URLS でどのように機能しますか? 私が知る必要がある Cookie オフに関する問題はありますか?
  • セッションを従来とは異なる方法で考えるべきですか?
4

2 に答える 2

1

単体テストに関しては、偽のHttpContextオブジェクト(HttpContextBaseから拡張)と偽のセッションオブジェクト(SessionStateBaseから拡張)が必要になります。または、私たちが行っていることを実行して、 PhilHaacksHttpSimulatorを使用することもできます。完璧な解決策ではありませんが、aspを使用して何かを行うと、緊密に結合されたオブジェクトが非常に多く存在するため、特にエレガントなものを見つけることはできません。私たちはそれにぶつかり続けたので、それらのクラスをつかんでヘルパーライブラリに貼り付ける価値がありました。

Cookieはドメインごとに機能するため、実際には問題はありません。セッションはいつでもインプロセスでCookieなしになるように構成できます。

一般に、セッションで保持するものは非常にまばらです。しかし、それはWebフォームにも当てはまります。

于 2009-01-29T04:28:24.803 に答える
1

原則として、ASP.NET MVC アプリケーションで Session を使用することに問題はありませんが (少なくとも、他の ASP.NET アプリケーションで使用することほど問題はありません...)、私はそれが最後の手段であるべきだと感じがちです。 、他のことがうまくいかないとき。

あなたの質問は一般的に非常によく書かれていますが、Sessionに保存することを提案しているものについては詳しく説明していません。あなたの質問で見つけた2つの例は次のとおりです。

  • 現在のユーザーの電子メール
  • パートナーID

ユーザーの電子メール アドレスは、フォーム認証を使用している場合は既にフォーム認証から取得でき、まだサポートしていない他の ASP.NET メンバーシップ プロバイダーに追加できます。partnerid が実際に何であるかは明らかではありませんが、セッションがそれを保存できる唯一の場所であることに懐疑的です。

一方、実際にはセッションにのみ適合する、私たちに伝えていないものを保存する必要がある可能性は十分にあります。

したがって、この道を行き過ぎる前に、保存する必要があるデータに対して他のソリューションがまだ利用可能でないことを確認してください。

于 2009-01-29T15:21:17.650 に答える