2010-10-18 45 views
17

我試圖讓我的所有視圖繼承自一個自定義類,以便我可以添加某些行爲和值到所有頁面,但我有一些問題。我試過子類System.Web.Mvc.WebViewPage,但我不得不執行一個執行過程,我不知道它應該做什麼。此外,如果我嘗試訪問Context變量,我會得到一個空引用(真的很奇怪)。這導致我認爲我可能有錯誤的基類......什麼是在ASP.NET MVC3 Razor視圖的基類

有什麼想法?

+0

您可以通過擴展方法將行爲添加到所有類中,還是需要它們作爲實例方法? – R0MANARMY 2010-10-18 22:18:11

+0

主要我需要添加一些可以從視圖中引用的變量。我知道我可以使用擴展方法來實現這一點,但應該有一種像aspx視圖引擎一樣的自定義viewpage類的方法。 – Diego 2010-10-18 22:23:10

回答

30

Diego,System.Web.Mvc.WebViewPage是正確的基本類型(如果需要強類型視圖,您應該有另一個類繼承System.Web.Mvc.WebViewPage<TModel>)。您應該將自己的班級標記爲abstract,以便您不必強制實施Execute方法。

更新:要配置所有視圖以使用自定義基類,請查看~\Views\Web.config文件。裏面有一個Razor特定的部分,您可以使用pageBaseType屬性來配置您的自定義類型。

就Context屬性而言,視圖執行後應該完全初始化它。但是,如果您嘗試訪問它太早(例如,從您的類構造函數),它可能無法使用。你什麼時候試圖訪問它?


Execute方法是Razor編譯器在編譯視圖時提供的。例如,給出下面的視圖文件

Hello @Name! 

剃刀編譯器會在幕後生成以下類(這是一種簡化,所以細節可能會關閉,但它應該傳達出點)

public class _Some_Generated_Class_Name_ : System.Web.Mvc.WebViewPage { 
    public void Execute() { 
    Write("Hello "); 
    Write(Name); 
    Write("!"); 
    } 
} 

然後,框架調用視圖類的Execute方法,並執行視圖。

+0

在我的類的構造函數:)那一定是那麼。 – Diego 2010-10-19 20:49:24

+0

正如問題的附錄,Execute過程應該做什麼?如果我只是用一個空白的程序覆蓋它可以嗎? – Diego 2010-10-19 20:50:07

+0

@Diego我編輯了我的答案,以說明編譯器如何爲Execute生成實現。 – marcind 2010-10-19 22:57:54

相關問題