为什么CreateView中的masterPath参数为空?

时间:2012-11-18 17:46:27

标签: asp.net-mvc-3 razor

编写一个小概念验证应用程序,并想知道为什么masterPath参数为空:

在application_start中:

ViewEngines.Engines.Add(new AlternateLocationViewEngine(
                new string[] { 
                    "~/Views/Shared/_Layout.cshtml", //Is this correct? Can/should i do that
                    "~/Views/Shared/{0}.cshtml",
                    "~/Plugins/Views/Shared/{0}.cshtml",
                },
                new string[] { 
                    "~/Plugins/Views/{1}/{0}.cshtml", 
                    "~/Plugins/{1}/{0}.chstml",    
                    "~/Plugins/Views/Shared/{0}.cshtml" 
                }
            ));




public class AlternateLocationViewEngine : RazorViewEngine 
    {
        public AlternateLocationViewEngine(string[] masterLocations, string[] viewLocations)
            : base()
        {
            MasterLocationFormats = masterLocations;
            ViewLocationFormats = viewLocations;
            PartialViewLocationFormats = ViewLocationFormats;

        }

        protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
        {
            if (string.IsNullOrEmpty(masterPath))
            {               
                masterPath = MasterLocationFormats.ElementAt(0);
            }


            var nameSpace = controllerContext.Controller.GetType().Namespace;
            return base.CreateView(controllerContext, viewPath.Replace("%1", nameSpace), masterPath.Replace("%1", nameSpace));
        }
    }

如您所见,我强迫在方法CreateView()中检查masterPath是否为空。为什么是这样?我错过了一些基本的东西吗?

我的开发环境:ASP.NET MVC3,Razor,.NET4

1 个答案:

答案 0 :(得分:2)

创建具有masterName的ViewResult时,masterPath将只有一个值。

protected internal ViewResult View(string viewName, string masterName);

在内部,RazorView在其构造函数中处理null masterPaths。

// where layoutPath is the masterPath arg from the RazorViewEngine's CreateView
LayoutPath = layoutPath ?? String.Empty;

渲染视图时,RazorView会将OverridenLayoutPath设置为masterPath(如果提供)。

// An overriden master layout might have been specified when the ViewActionResult got returned.
// We need to hold on to it so that we can set it on the inner page once it has executed.
webViewPage.OverridenLayoutPath = LayoutPath;

您无需将_Layout指定为MasterLocationFormats之一。以下是RazorViewEngine的默认行为。

  MasterLocationFormats = new[] {
            "~/Views/{1}/{0}.cshtml",
            "~/Views/{1}/{0}.vbhtml",
            "~/Views/Shared/{0}.cshtml",
            "~/Views/Shared/{0}.vbhtml"
        };

您可以查看source code以获取更多灵感。

相关问题