2011-10-16 4 views
5

.NET Razor Webアプリケーションでは、Layoutをプログラムで設定しようとしています。 _ViewStart.cshtmlを使用することはできません。すべてのページに@{ Layout = "..." }を設定することはできません。これは私が出ているものです:.NET MVC 3プログラムでレイアウトを設定する

ベースWebViewPageクラス:

public abstract class SitePage<T> : System.Web.Mvc.WebViewPage<T> 
{ 
    private object _layout; 

    public new dynamic Layout { get { return _layout; } } 

    public override void InitHelpers() 
    { 
     base.InitHelpers(); 
     _layout = "~/Themes/" + Settings.Theme + "/Views/_Layout.cshtml"; 
    } 
} 

とアプリケーションweb.configで私は、このベースページを使用するすべてのビューを指定します。しかし、Layoutは決して使用されていないようです。ここで何が間違っているのでしょうか?

public override string Layout { get; set; } 

あなたはLayoutプロパティをオーバーライド、またはあなたの目的を達成するために、あなたの_layoutロジックを変更することができます。

答えて

9

WebViewPageクラスは、名前付きプロパティLayout等を有しているWebPageBaseを継承しています。たとえば、次のように

public abstract class SitePage<T> : System.Web.Mvc.WebViewPage<T> { 

    // set this modifier as protected, to make it accessible from view-pages 
    protected string _layout{ 
     get { 
      return base.Layout; 
     } 
     set { 
      base.Layout = value; 
     } 
    } 

    public override void InitHelpers() { 
     base.InitHelpers(); 
     _layout = "~/Themes/" + Settings.Theme + "/Views/_Layout.cshtml"; 
    } 
} 

および/またはビュー・ページでは、あなたもそれを設定することができます。

@{ 
    _layout = "_Your_Special_Layout.cshtml"; 
} 

UPDATE:続きを_layout割り当てる際に、スタック・オーバー・フローを避けるためにフラグを使用しますその度:

public abstract class SitePage<T> : System.Web.Mvc.WebViewPage<T> { 

    public bool LayoutAssigned { 
     get { 
      return (ViewBag.LayoutAssigned == true); 
     } 
     set { 
      ViewBag.LayoutAssigned = value; 
     } 
    } 

    // set this modifier as protected, to make it accessible from view-pages 
    protected string _layout{ 
     get { 
      return base.Layout; 
     } 
     set { 
      base.Layout = value; 
     } 
    } 

    public override void InitHelpers() { 
     base.InitHelpers(); 
     if(!LayoutAssigned) { 
      _layout = "~/Themes/" + Settings.Theme + "/Views/_Layout.cshtml"; 
      LayoutAssigned = true; 
     } 
    } 
} 
+0

これは、stackoverflowを引き起こしているようです。 Layout.cshtmlにpartialviewが含まれている場合、InitHelpersが再度呼び出されてレイアウトが設定され、Layout.cshtmlが再び初期化され、レイアウトが再度設定されるように見えます。 – jaap

+0

そうです。あなたはこれを解決するために何かをすることができます。そのうちの1人は、 'Layout'が割り当てられているかどうかをチェックするためにboolean-flagを使用しています。私のプロジェクトで使ったのは、レイアウト、ビューページ、部分ビューの3つの基本クラスがあることです。また、あなたのプロジェクトにとって特別な方法を見つけることができます –

+0

私は英語を話せません。私の文章が理解できない場合、申し訳ありません:D –

5

は、しかし私は持っていなかった私のカスタムクラス内WebViewPage.Layout変更、カスタムWebViewPageを実装することによって、今同じことを達成しようとしましたy効果(あなたも発見したように)。

は最終的に私はこのコードを持っている私の_ViewStart.cshtmlを変えてしまった:

@{ 
    this.Layout = this.Request.QueryString["print"] == "1" 
     ? "~/Views/Layout/_Print.cshtml" 
     : "~/Views/Layout/_Layout.cshtml"; 
} 

あなたがそれを望んでどのように実装されていない可能性がありますが、それは確かに乾いたものを維持ず、それが主なポイントです。

+0

私はこれが好きです。よくやった。 – tofutim

関連する問題