12

ビューがあり、レイアウト ページを使用したいと考えています。レイアウト ページでは、ビューの一部がオン/オフになる条件付きバナーが必要です。どうすればこれができるのだろうか?

これは_Layout.cshtmlページにあります...

@if (ShowBanner){

   <h1>banner</h1>

}

MVC View ページからこれをオン/オフするにはどうすればよいですか? それとも、これが正しいことなのか? ビューページでその変数を宣言しても、マスターはそれを知らないのですか?この 2 つは、C# を介してどのように通信しますか? Viewbag を使用しますか? むしろそうではありません。

ページまたはマスターメンバーを参照することがフォームですべてわかっていますが、MVCでそれを見ることができないようです...

どんな助けでも大歓迎です...

ありがとうピート

4

3 に答える 3

12

私はあなたと一緒です、Exitos:私も使用を避けViewBagます。ばかげた名前は別として、それに付随する弱いタイピングが嫌いです。解決策はありますが、ちょっと複雑なので、我慢してください。

まず、レイアウトに渡す「表示ヒント」を格納するクラスを作成します。私はこのクラスを独創的に「DisplayHints」と呼んでいます:

public class DisplayHints {
  // anything that you want passed from a view to the layout goes here
  public bool ShowBanner { get; set; }
}

WebViewPage<T>次に、ビューの新しい基本クラスとなる派生クラスを作成します。という名前のプロパティがDisplayHints格納されていることに注意してくださいViewData(コントローラー、ビュー、およびレイアウトで使用できます)。

public abstract class MyViewPage<T> : WebViewPage<T> {
  public DisplayHints DisplayHints {
    get {
      if( !ViewData.ContainsKey("DisplayHints") )
        ViewData["DisplayHints"] = new DisplayHints();
      return (DisplayHints)ViewData["DisplayHints"];
    }
  }
}

以下のコメンターが指摘したように、ViewDataは のように弱く型付けされていますViewBag。ただし、/に何かを格納しないようにする方法はありません。これは、弱く型付けされた変数の数を 1 つに最小化するだけです。これが完了したら、強く型付けされた情報を必要なだけ格納できます。ViewDataViewBagDisplayHints

ビューの基本クラスができたので、 でWeb.config、カスタム基本クラスを使用するように MVC に指示する必要があります。

<pages pageBaseType="MyNamespace.Views.MyViewPage">

大変な作業のように思えますが、このすべての作業でいくつかの重要な機能を得ることができます。ビューで、次のように必要な表示ヒントを設定できます。

@{ DisplayHints.ShowBanner = true; }

レイアウトでは、同じように簡単にアクセスできます。

@if( DisplayHints.ShowBanner ) {
  <div>My banner....</div>
}

これが役立つことを願っています!

于 2012-04-10T19:44:58.193 に答える
3

レイアウト用のモデルを持つことは、すべてのビューがそのモデルを使用することを強制するため、良い考えではありません。ただし、そのタイプの情報を ViewBag に入れ、コントローラー ベースの 1 つのコンストラクターに値を設定することができます。

于 2012-04-10T19:09:09.493 に答える
2

レイアウトでセクションを定義できます。ビューがそのセクションを「埋める」責任がある場合、ビューはそのセクションに HTML を配置できます。

ここでは、SECTIONS の使用に関する詳細なステップバイステップのチュートリアルを見ることができます。

http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx

于 2012-04-10T19:41:20.993 に答える