Mvc 多级控制器 路由重写 及 多级Views目录 的寻找视图的规则

1.那么咱们再来看咱们须要的访问方式,以下图

      若是咱们要访问Admin下的TestController里面的Index页面,那么咱们输入Test/Index,这个确定不行的。由于TestController根本就不在Controllers的根目录下,而是在Controllers/Admin下,这样咱们根本就找不到Test这个Controller。那么咱们输入Admin/Test/Index,那么咱们就须要添加一个路由配置了,由于之前的默认路由只能经过{Controller}/{Action}/{Id}这种方式访问,就是必须以Controller开头。咱们从新配置的路由以下:html

复制代码
public static void RegisterRoutes(RouteCollection routes)
         {
             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
             
             //路由规则匹配是从上到下的,优先匹配的路由必定要写在最上面。由于路由匹配成功之后,他不会继续匹配下去。
             routes.MapRoute(
                "Admin", // 路由名称,这个只要保证在路由集合中惟一便可
                "Admin/{controller}/{action}/{id}", //路由规则,匹配以Admin开头的url
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 
            );
 
             routes.MapRoute(
                 "Default", // Route name
                 "{controller}/{action}/{id}", // URL with parameters
                 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
             );
 
     }
复制代码

 那么咱们这个时候再次输入Admin/Test/Index,能找到Views/Admin/Test/Index.cshtml这个页面吗?显然是不能的,由于除了路由配置怎么访问Controller外,寻找Views里面的页面也有本身的规则。测试结果确定是找不到页面,咱们看看错误信息就知道他是怎么寻找cshtml页面了。ide

    

razor视图的地址,写成通配符就是:

  • Views/{1}/{0}.cshtml
  • Views/Shared/{0}.cshtml

{1}表示Controller的名称,{0}表示视图名称,Shared是存放模板页的文件夹。一看就很清楚了。这个就是寻找视图的规则,因此咱们存放在Admin/Test/Index.cshtml的存放规则就不知足。那么咱们修改下,以下图:测试

  直接将Test文件夹存放在Views下面,那么咱们就知足这个寻找视图的规则了,咱们输入Admin/Test/Index,也确实访问成功了。url

    

可是这个方式的存储确定不是咱们须要的,既然咱们Controller区分存放了,咱们确定也但愿Views也可以这样存放的。spa

3.那么咱们进入正题,修改他的寻找视图的规则,让他可以按照咱们的规则来访问,就像修改路由同样。

在项目中新创建一个cs类MyViewEngine,继承RazorViewEngine。代码以下:3d

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcRoute.MvcEx
{

    public sealed class MyViewEngine : RazorViewEngine
    {

        public MyViewEngine()
        {
            ViewLocationFormats = new[]
            {
                "~/Views/{1}/{0}.cshtml",
                "~/Views/Shared/{0}.cshtml",
                "~/Views/Admin/{1}/{0}.cshtml"//咱们的规则
            };
        }
        public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
        {
            return base.FindView(controllerContext, viewName, masterName, useCache);
        }

    }
}
复制代码

而后将这个规则注册到系统中,在global中注册一下,这样咱们就能够经过本身的方式来访问了。global注册以下:code

复制代码
protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);

            RegisterView();//注册视图访问规则
        }

        protected void RegisterView()
        {
            ViewEngines.Engines.Clear();
            ViewEngines.Engines.Add(new MyViewEngine());
        }
复制代码

 结果以下图:orm

    

相关文章
相关标签/搜索