以编程方式从aspx文件中确定母版页的名称

时间:2010-11-02 19:24:18

标签: asp.net-mvc asp.net-mvc-2

我正在编写一个自定义的WebFormViewEngine,我想在调用WebFormViewEngine.FindView方法时找出视图的aspx文件中指定的母版页文件的名称。

我的最终目标是确定所需母版页文件的名称,以便我可以在不同的目录中使用同名的母版页文件来呈现视图。

所以挑战在于我有视图的文件路径,但在呈现视图之前 我想确定母版页文件的名称。

我可以打开文件并搜索MasterPageFile =“%”,但我希望有更好的方法来做到这一点。

感谢。

1 个答案:

答案 0 :(得分:1)

母版页查找的工作方式与您的想法不同。在MVC WebForms视图引擎中,基本上有两种指定母版页的方法:

  1. 在视图页面的<%@ Page %>指令中 此方法实际上不是特定于MVC的,它取决于WebForms控制树中内置的功能。您需要提供完整路径,MVC管道永远不会查看此值,因为只有在视图开始执行后才会对其进行设置和评估(在WebFormViewEngine.FindView之后发生)。

  2. 在您的操作方法中,ViewResult:return View("Index", "MyCustomMaster")
    您可以从控制器覆盖母版页。在这种情况下,您只能指定主视图名称或主文件的完整路径。此值确实传递到WebFormViewEngine.FindView,并覆盖了视图本身中指定的任何值。

  3. 如果您始终只使用#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;
        }
    }