2010-11-02 59 views
0

我正在編寫一個自定義的WebFormViewEngine,我想弄清楚調用WebFormViewEngine.FindView方法時在視圖的aspx文件中指定的主頁面文件的名稱。以編程方式確定主頁的名稱從aspx文件

我的最終目標是確定所需母版頁文件的名稱,以便我可以使用不同目錄中的同名母版頁文件來呈現視圖。

所以挑戰是我有視圖的文件路徑,但視圖呈現之前我想確定母版頁文件的名稱。

我可以打開文件並搜索MasterPageFile =「%」,但我希望有更好的方法來做到這一點。

謝謝。

回答

1

主頁面查找的工作方式與您的想法不同。在MVC WebForms的視圖引擎基本上有指定母版頁的方法有兩種:

  1. <%@ Page %>指令的視圖頁。
    此方法實際上並不是MVC特定的,它取決於WebForms控件樹中內置的功能。您需要提供完整路徑,並且MVC管道永遠不會查看該值,因爲只有在視圖開始執行時纔會設置和評估該值(發生在WebFormViewEngine.FindView之後)。

  2. 在您的操作方法ViewResult中:return View("Index", "MyCustomMaster")
    您可以覆蓋控制器的母版頁。在這種情況下,您只能指定主視圖名稱或主文件的完整路徑。該值確實傳遞到WebFormViewEngine.FindView,並覆蓋視圖本身可能指定的任何值。

如果始終只使用#2,則值將總是通過WebFormViewEngine.FindView。但是,如果您還使用#1,那麼你就基本都做同樣的事情,MVC確實使#2:編寫自己的自定義頁面類:

public class MyViewPage : System.Web.Mvc.ViewPage { 
    protected override void OnPreInit(EventArgs e) { 
     base.OnPreInit(e); 

     // you might not need the following, but perhaps it would be useful to 
     // differentiate between #1 and #2 
     bool masterOverridenInController = !String.IsNullOrEmpty(MasterLocation); 

     string currentPathToMaster = MasterPageFile; 
     // change currentPathToMaster any way you like 
     MasterPageFile = currentPathToMaster; 
    } 
} 
+0

感謝徹底反應,@marcind,但我正在尋找一個解決方案,可以在WebFormViewEngine繼承的自定義類中完成工作。 我建立了這個例子,http://www.codeproject.com/KB/aspnet/ASPNETMVCDynamicThemes.aspx和重寫的FindView方法,我可以確定我需要的主路徑,並傳遞給this.CreateView( controllerContext,viewPath,masterPath)。有沒有一種方法可以確定當時的母版頁路徑? – jaminto 2010-11-02 21:04:26

+0

正如我已經解釋的那樣,#1從未將視圖頁面中聲明的主文件路徑傳遞給'FindView'。你大概可以自己解析視圖頁面文件,但是你對這個框架很有幫助。我試圖提出一種使用框架的方式。 – marcind 2010-11-02 21:19:25

相關問題