我正在编写一个自定义的WebFormViewEngine,我想在调用WebFormViewEngine.FindView方法时找出视图的aspx文件中指定的母版页文件的名称。
我的最终目标是确定所需母版页文件的名称,以便我可以在不同的目录中使用同名的母版页文件来呈现视图。
所以挑战在于我有视图的文件路径,但在呈现视图之前 我想确定母版页文件的名称。
我可以打开文件并搜索MasterPageFile =“%”,但我希望有更好的方法来做到这一点。
感谢。
答案 0 :(得分:1)
母版页查找的工作方式与您的想法不同。在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;
}
}