您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關(guān)MVC路由自定義及視圖找尋規(guī)則的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
MVC路由自定義
相信對于MVC路由的配置大家也都了解過一些,其實,這也不是本章的重點。
創(chuàng)建MVC項目的時候,根目錄下>>App_Start>>RouteConfig,這個類就是用來配置路由的,開始會有個默認路由。
簡單介紹下:***個參數(shù):路由名稱(***),第二個參數(shù)url:需要注意的是{controller}、{action}都是相當于占位符。第三個參數(shù)則是默認路由了。
場景:當你的控制器需要根據(jù)不同功能來分類時,假如需要做不同產(chǎn)品,希望把同一產(chǎn)品的控制器放在一起??梢赃@樣做:
添加一條路由規(guī)則:
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Product", url: "Product/AboutPrice/{controller}/{action}/{id}", defaults: new { controller = "Sale", action = "Index", id = UrlParameter.Optional } ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }
注意點:路由規(guī)則匹配是從上到下的,優(yōu)先匹配的路由一定要寫在最上面。因為路由匹配成功以后,它就不會繼續(xù)匹配下去。當然我們創(chuàng)建的控制器目錄也得符合才能匹配。
結(jié)果:
MVC視圖找尋規(guī)則
在上面那部分即使我們自定義了路由,但是視圖創(chuàng)建的位置還是得乖乖放在Views文件夾下,(不然的話,結(jié)果肯定是找不到視圖)我們同樣也希望View位置是可配。
希望控制器返回的視圖能在這個目錄下:
①首先,需要寫一個類來自定義我們視圖的映射規(guī)則,這里我就建在App_Start文件夾下,跟其他配置類一起。
public sealed class MyViewRule:RazorViewEngine { public MyViewRule() { ViewLocationFormats = new string[] { //我們定義的視圖找尋規(guī)則,和路由配置一樣,它是從上往下匹配,如果兩個路徑下都有著視圖,它會展示***個。 "~/ProductViews/AboutPrice/{1}/{0}.cshtml", //這是默認設(shè)置的,覺得用不到可以刪掉,{1}表示控制器名稱,{0}表示視圖名稱 "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml" }; } }
②然后,需要在全局Global.asax.cs里面注冊我們的規(guī)則,代碼如下:
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //上面是項目創(chuàng)建默認注冊的,下面兩條:先把原來的規(guī)則清空,再把我們設(shè)置加上() ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new MyViewRule()); } }
測試結(jié)果:
錯誤:The view at '~/ProductViews/AboutPrice/Sale/Index.cshtml' must derive from WebViewPage, or WebViewPage<TModel>.
大概意思是:沒有繼承這個WebViewPage類,在編譯的時候,這個視圖頁面也是會生成一個類的,解決的辦法有兩種:
①直接讓它繼承那個類(@inherits System.Web.Mvc.WebViewPage)
@{ Layout = null; } @inherits System.Web.Mvc.WebViewPage <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <div> 我視圖位置不一樣的哦! </div> </body> </html>
當然,上面這個辦法,有個不好的地方就是每次添加一個視圖就得寫一次,視圖多的話極不方便。我們還可以通過配置文件讓它繼承WebViewPage
②添加配置文件(web.config),在pages節(jié)點下繼承WebViewPage?;蛘咴谀J創(chuàng)建Views文件夾下有個Web.config復制到/ProductViews/AboutPrice下。(局部配置文件,就近原則)
<pages pageBaseType="System.Web.Mvc.WebViewPage"> </pages>
結(jié)果:
關(guān)于“MVC路由自定義及視圖找尋規(guī)則的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。