2011-10-16 81 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類從WebPageBase具有命名屬性Layout像繼承。例如:

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

這似乎是導致一個計算器。當Layout.cshtml包含partialview時,再次調用InitHelpers並設置佈局,然後Layout.cshtml似乎再次初始化並再次設置佈局等。 – jaap

+0

您是對的。你可以做一些事情來解決這個問題。其中之一是使用布爾標誌來檢查「佈局」是否被分配。我在我的項目中使用的是,我有3個基類,用於佈局,查看頁面和部分視圖。你也可以找到其他特別的方法 –

+0

我不會說英語好。所以對不起,如果我的句子是不可理解的:D –

5

我試圖通過實現自定義WebViewPage剛纔達到相同的,但是改變WebViewPage.Layout我的自定義類中沒有一個y效應(正如你也發現的那樣)。

最後我最終改變我的_ViewStart.cshtml有這樣的代碼:

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

它可能無法實現你怎麼想它,但它肯定不會讓事情變得乾燥,這是主要的點。

+0

我喜歡這個。做得好。 – tofutim