3

私はMVCを試しています。私の質問は - です。私はWebFormsを使ってマスターページにPage_Loadロジックを持っていましたが、どこにMVCを入れるべきですか?はここでビジネスケースです:"Master Page"ロジックはMVCにどこに入るべきですか?

  • 別のホストヘッダーは、別のページタイトルは、サイトの(1)マスターページ上に表示されるので、すべてのページが発生する必要があります。たとえば、ホストヘッダーがhello.mydomain.comの場合、すべてのページ/ビューでページタイトルが「Hello World」になり、goodbye.mydomain.comはすべてのページ/ビューで「Goodbye World」になります。
  • アプリケーションのどこに関係なく、ホストヘッダーがリストにあるものと異なる場合は、/ Error/NoHostHeaderにリダイレクトする必要があります。

以前は、これをMasterPage Load()イベントに入れました。これはMVCのように見えますが、すべてのコントローラでこれを行うことができます(この機能をすべてコントローラ)、またはGlobal.asaxのどこかにある(グローバルに見えますか?)

編集:これは、実際にデータを処理するためのコントローラと組み合わせたGlobal.asaxメソッドを使用して正常に動作するようになっています。この時点で問題となるのは、すべてのホストヘッダー情報がデータベース内にあることだけです。私は通常あなたがセッション変数に入り、そこにいないときにのみDB呼び出しを行う場合には "テナント"情報を保存します。これを行うには良い方法がありますか?

答えて

9

からP

盗まれたコードがあります何1:理由のためにMVCで1当量ない、ちょうどそれについてMVCの方法を考えるためにどのように再現してみましょう:

モデル:「このサイトのページは、常に特定のコンテキストで要求されている、のは、テナント(それを呼びましょうまたは使用するr、トピックまたはあなたのサブドメインが表すもの)。ドメインモデルは、現在の要求のテナントを表すプロパティを持っている「

ビュー: 『。モデルに設定されたテナントに応じて、ページのタイトルをレンダリング』を

コントローラー:」テナントを設定しますホストヘッダー」に応じて、モデルに。

我々はもっとして一つの場所や場所にコントローラロジックを持つ。コントローラ、ビューとビジネスロジックを混合されないようにしたいものを、それが呼び出されないことに注意してください「コントローラ」は分離されている限り、問題ではありません。

そして良いこと:Webフォームでもこの「MVCスタイル」を実行できますが、ソリューションはまだASP.NET MVCで動作します!

リクエストライフサイクル(ページのライフサイクルではありません)がまだあるので、すべてのリクエストに対してコントローラロジックのこの部分を含むカスタムHttpModuleを実装できます。 BeginRequestイベントを処理し、ホストヘッダーをチェックし、テナントをHttpContext.Current.Items ["tenant"]のようなものに格納します。

次に、すべてのモデルオブジェクト(またはモデルベースクラス、またはソリューションに適したもの)は、HttpContextにアクセスしてこれにアクセスできるようになりますこのような情報:

public string Tenant 
{ 
    get { return HttpContext.Current.Items["tenant"]; } 
} 

長所:あなたが原因(ホストヘッダー)と効果(ページタイトルをレンダリング)

  • したがって保守およびテスト容易性を向上させることを区切っている

    • 現在のテナントに応じてデータベースからコンテンツをロードするなど、この状態に基づいてドメインモデルに追加の動作を簡単に追加できます。
    • ビューのより多くの部分を、あなたが含むCSSファイル、ロゴイメージなどのようにテナントに依存させることが容易にできます。
    • 後でモデルにテナントを設定するようにコントローラロジックを変更できますサブドメインではありませんが、モデルに応じてコードを変更することなく、クッキー、リファラー、検索ターム、ユーザーエージェントの言語など、何でも考えることができます。あなたの編集再

    アップデート:私はあなたのセッションクッキーは、各サブドメインに、しかし、すべてのドメインにだけではなく、適用される可能性のある場合は特に、セッション状態を保持するというアイデアが好きではありません。この場合、ユーザーが以前に別のサブドメインを使用していた場合、矛盾したコンテンツを提供する可能性があります。おそらくホストヘッダーをテナントにマッピングするデータベース内の情報は頻繁に変更されないため、キャッシュすることができ、すべての要求に対してデータベースルックアップは必要ありません。あなたが必要なもの

  • 3

    MVCマスターページビューに正しいViewDataを提供したベースコントローラーを作成し、実際のコントローラーをそれぞれから派生させることができます。ロジックをActionExecutingメソッドに入れると、例外を生成するか、必要に応じてエラーページにリダイレクトすることができます。

    3

    あなたはあまりにも "WebForms"と考えて、十分なMVCではありません。マスターページはビューのラッパーにすぎず、レイアウトhtmlのみを含める必要があります。あなたはマスターに物資を送ることができますが、一方通行であり、あなたは無関係な意見に努めなければなりません。結論:ここではWebFormsが使用されないため、WebFormsが持つイベントを忘れてしまいます。

    あなたは私はあなたがGlobal.asaxの中にそれを置くことができると仮定ホストヘッダーを扱っているので...偉大な今私は混乱している:http://forums.asp.net/t/1226272.aspx

    protected void Application_BeginRequest(object sender, EventArgs e) 
         { 
          string host = string.Empty; 
    
          if (this.Request.ServerVariables["HTTP_HOST"] == this.Request.Url.DnsSafeHost) 
          { 
           host = this.Request.Url.DnsSafeHost; 
          } 
          else 
          { 
           Regex regex = new Regex("http://[^/]*.host/([^/]*)(/.*)"); 
           Match match = regex.Match(this.Request.Url.AbsoluteUri); 
    
           if (match.Success) 
           { 
            host = match.Groups[1].Value; 
            Context.RewritePath(match.Groups[2].Value); 
           } 
          } 
    
          // Match the host with the portal in the database 
          ... 
         } 
    
    +0

    で、答えを組み合わせ、Global.asaxの中でこれを行うとセッションに関連する情報を割り当て、その後、ベースコントローラを介して、それらのセッションオブジェクトにアクセスすることは合理的に聞こえるのですか? – Brandon

    関連する問題