爱上MVC3系列~改变Areas的FindView顺序

简介:

我们在开发MVC项目时,由于项目比较大,往往会根据模块去建立Areas,这样不仅可以使程序的结构清晰,而且也有利于进行路由的部属。而在进行Areas的开发时,我们往往会有这样的情况:

1 Areas下有自己的_Layout模板,而我们希望所有Areas都用公用的(~/views/shared)下的模板,这样我们应该怎么做呢?

两个模版的名称是一样的,在MVC中它会优先使用那个呢?

这是我们所关注的问题,经过测试表明,在默认情况下,MVC会使用自己Areas里定义的模板,而不会使用View/Shares目录的,这很正常,因为它的优先级肯定是以离它最近的那个模板为主。

总结 views的查询顺应是:

而如果我们要改变这样顺序,我们可以通过ViewEngines类型下的Engines属性,它是一个ViewEngineCollection类型的集合,我们可以向里面往很多模板规则,它会以第一个规则为准。而这些规则我们可以向路由规则一样在global里进行注册。

   protected void Application_Start()
        {
            #region 注册页面引擎
            ViewEngines.Engines.Clear();//清空所有FindView規則
            ViewEngines.Engines.Insert(0, new CustomRazorViewEngine());
            #endregion
...
}
 1  /// <summary>
 2         /// 建立一个页面搜索引擎,针对Razor
 3         /// 按著自己希望的VIEW定位順序去訂定,默認情況下areas区域的view查询时,先找自己的areas,然后找view/shared,
 4         /// 我们可以改变它的顺序
 5         /// </summary>
 6         private class CustomRazorViewEngine : RazorViewEngine
 7         {
 8             public CustomRazorViewEngine()
 9                 : base()
10             {
11                 base.AreaMasterLocationFormats = new string[]
12                 {
13                       "~/Views/Shared/{0}.cshtml",
14                     "~/Areas/{2}/Views/{1}/{0}.cshtml", 
15                      "~/Areas/{2}/Views/Shared/{0}.cshtml", 
16                    
17                  };
18 
19                 base.AreaViewLocationFormats = new string[] 
20                 { 
21                     "~/Areas/{2}/Views/{1}/{0}.cshtml", 
22                      "~/Areas/{2}/Views/Shared/{0}.cshtml",
23                     "~/Views/Shared/{0}.cshtml"
24                 };
25 
26                 base.AreaPartialViewLocationFormats = base.AreaViewLocationFormats;
27             }
28         }

OK,我们可以看到,我们把"~/Views/Shared/{0}.cshtml"这个规则放到上第1个位置,这时,它会被优先使用。

看来,回头应该把global里的用法写个文章了,呵呵。

 本文转自博客园张占岭(仓储大叔)的博客,原文链接:爱上MVC3系列~改变Areas的FindView顺序,如需转载请自行联系原博主。

目录
相关文章
|
7月前
|
设计模式 前端开发 Java
Java设计模式【二十六】:MVC模式
Java设计模式【二十六】:MVC模式
74 0
|
架构师 JavaScript 数据库
MVC+WCF实现一条线对应的改动
经过几天的努力,终于在ITOO4.1学习积累过程--在现在的组织部重构实践中,自己搭建成功了一个WCF框架,加上这几天写了几条线的理解,就将MVC+WCF实现一条线对应的改动总结了一下,与大家分享。
|
C#
艾伟:Silverlight 里如何实现隐式样式,ImplicitStyleManager 的实现思想
在 WPF 中,我们可以方便的在全局范围定义一个样式,就可以应用到所有这种类型的对象,这就是所谓的隐式样式(implicit Style),比如: WPF中定义样式 Button aButton b 这样之后,两个按钮就都变成了浅蓝色的背景。
973 0