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

    

相關文章
相關標籤/搜索