我正在編寫一個自定義的WebFormViewEngine,我想弄清楚調用WebFormViewEngine.FindView方法時在視圖的aspx文件中指定的主頁面文件的名稱。以編程方式確定主頁的名稱從aspx文件
我的最終目標是確定所需母版頁文件的名稱,以便我可以使用不同目錄中的同名母版頁文件來呈現視圖。
所以挑戰是我有視圖的文件路徑,但視圖呈現之前我想確定母版頁文件的名稱。
我可以打開文件並搜索MasterPageFile =「%」,但我希望有更好的方法來做到這一點。
謝謝。
我正在編寫一個自定義的WebFormViewEngine,我想弄清楚調用WebFormViewEngine.FindView方法時在視圖的aspx文件中指定的主頁面文件的名稱。以編程方式確定主頁的名稱從aspx文件
我的最終目標是確定所需母版頁文件的名稱,以便我可以使用不同目錄中的同名母版頁文件來呈現視圖。
所以挑戰是我有視圖的文件路徑,但視圖呈現之前我想確定母版頁文件的名稱。
我可以打開文件並搜索MasterPageFile =「%」,但我希望有更好的方法來做到這一點。
謝謝。
主頁面查找的工作方式與您的想法不同。在MVC WebForms的視圖引擎基本上有指定母版頁的方法有兩種:
在<%@ Page %>
指令的視圖頁。
此方法實際上並不是MVC特定的,它取決於WebForms控件樹中內置的功能。您需要提供完整路徑,並且MVC管道永遠不會查看該值,因爲只有在視圖開始執行時纔會設置和評估該值(發生在WebFormViewEngine.FindView
之後)。
在您的操作方法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;
}
}
感謝徹底反應,@marcind,但我正在尋找一個解決方案,可以在WebFormViewEngine繼承的自定義類中完成工作。 我建立了這個例子,http://www.codeproject.com/KB/aspnet/ASPNETMVCDynamicThemes.aspx和重寫的FindView方法,我可以確定我需要的主路徑,並傳遞給this.CreateView( controllerContext,viewPath,masterPath)。有沒有一種方法可以確定當時的母版頁路徑? – jaminto 2010-11-02 21:04:26
正如我已經解釋的那樣,#1從未將視圖頁面中聲明的主文件路徑傳遞給'FindView'。你大概可以自己解析視圖頁面文件,但是你對這個框架很有幫助。我試圖提出一種使用框架的方式。 – marcind 2010-11-02 21:19:25