MVC路由自定义及视图找寻规则
這篇關(guān)于MVC路由及視圖規(guī)則本來是昨天要發(fā)的,但是本人真的有點(diǎn)懶,終于今天忍無可忍了。初學(xué)MVC的時候比現(xiàn)在還菜一點(diǎn)(現(xiàn)在也很菜),想著會用就行,但是有時還是會好奇,為什么它能找到控制器?為什么控制器return View();就能找到視圖,而為什么視圖一定要建在Views文件下?好像說的有點(diǎn)多了,接下來一邊上例子,一邊分析!
? MVC路由自定義
相信對于MVC路由的配置大家也都了解過一些,其實(shí),這也不是本章的重點(diǎn)。
創(chuàng)建MVC項(xiàng)目的時候,根目錄下>>App_Start>>RouteConfig,這個類就是用來配置路由的,開始會有個默認(rèn)路由。
? ?簡單介紹下:第一個參數(shù):路由名稱(唯一),第二個參數(shù)url:需要注意的是{controller}、{action}都是相當(dāng)于占位符。第三個參數(shù)則是默認(rèn)路由了。
? ?場景:當(dāng)你的控制器需要根據(jù)不同功能來分類時,假如需要做不同產(chǎn)品,希望把同一產(chǎn)品的控制器放在一起。可以這樣做:
添加一條路由規(guī)則:
1 public static void RegisterRoutes(RouteCollection routes) 2 { 3 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 4 routes.MapRoute( 5 name: "Product", 6 url: "Product/AboutPrice/{controller}/{action}/{id}", 7 defaults: new { controller = "Sale", action = "Index", id = UrlParameter.Optional } 8 ); 9 10 routes.MapRoute( 11 name: "Default", 12 url: "{controller}/{action}/{id}", 13 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 14 ); 15 }注意點(diǎn):路由規(guī)則匹配是從上到下的,優(yōu)先匹配的路由一定要寫在最上面。因?yàn)槁酚善ヅ涑晒σ院?#xff0c;它就不會繼續(xù)匹配下去。當(dāng)然我們創(chuàng)建的控制器目錄也得符合才能匹配。
?
結(jié)果:
?
MVC視圖找尋規(guī)則
? 在上面那部分即使我們自定義了路由,但是視圖創(chuàng)建的位置還是得乖乖放在Views文件夾下,(不然的話,結(jié)果肯定是找不到視圖)我們同樣也希望View位置是可配。
希望控制器返回的視圖能在這個目錄下:
?
①首先,需要寫一個類來自定義我們視圖的映射規(guī)則,這里我就建在App_Start文件夾下,跟其他配置類一起。?
1 public sealed class MyViewRule:RazorViewEngine 2 { 3 public MyViewRule() { 4 5 ViewLocationFormats = new string[] { 6 //我們定義的視圖找尋規(guī)則,和路由配置一樣,它是從上往下匹配,如果兩個路徑下都有著視圖,它會展示第一個。 7 "~/ProductViews/AboutPrice/{1}/{0}.cshtml", 8 //這是默認(rèn)設(shè)置的,覺得用不到可以刪掉,{1}表示控制器名稱,{0}表示視圖名稱 9 "~/Views/{1}/{0}.cshtml", 10 "~/Views/Shared/{0}.cshtml" 11 }; 12 }13 }
?
②然后,需要在全局Global.asax.cs里面注冊我們的規(guī)則,代碼如下:?
1 public class MvcApplication : System.Web.HttpApplication 2 { 3 protected void Application_Start() 4 { 5 AreaRegistration.RegisterAllAreas(); 6 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 7 RouteConfig.RegisterRoutes(RouteTable.Routes); 8 BundleConfig.RegisterBundles(BundleTable.Bundles); 9 //上面是項(xiàng)目創(chuàng)建默認(rèn)注冊的,下面兩條:先把原來的規(guī)則清空,再把我們設(shè)置加上() 10 ViewEngines.Engines.Clear(); 11 ViewEngines.Engines.Add(new MyViewRule()); 12 } 13 }
測試結(jié)果:?
錯誤:The view at '~/ProductViews/AboutPrice/Sale/Index.cshtml' must derive from WebViewPage, or WebViewPage<TModel>.
大概意思是:沒有繼承這個WebViewPage類,在編譯的時候,這個視圖頁面也是會生成一個類的,解決的辦法有兩種:
①直接讓它繼承那個類(@inherits System.Web.Mvc.WebViewPage)
1 @{ 2 Layout = null; 3 } 4 @inherits System.Web.Mvc.WebViewPage 5 <!DOCTYPE html> 67 <html> 8 <head> 9 <meta name="viewport" content="width=device-width" /> 10 <title>Index</title> 11 </head> 12 <body> 13 <div> 我視圖位置不一樣的哦! 14 </div> 15 </body> 16 </html>
當(dāng)然,上面這個辦法,有個不好的地方就是每次添加一個視圖就得寫一次,視圖多的話極不方便。我們還可以通過配置文件讓它繼承WebViewPage
②添加配置文件(web.config),在pages節(jié)點(diǎn)下繼承WebViewPage。或者在默認(rèn)創(chuàng)建Views文件夾下有個Web.config復(fù)制到/ProductViews/AboutPrice下。(局部配置文件,就近原則)
<pages pageBaseType="System.Web.Mvc.WebViewPage"> </pages>結(jié)果:
總結(jié)
關(guān)于MVC怎么找到控制器,控制器怎么匹配視圖希望能給有需要的小伙伴一點(diǎn)幫助,也是自己的一個總結(jié),不妥之處,歡迎指正。
程序員在學(xué)習(xí)的路上永遠(yuǎn)不要怕遇到問題,這是成長,也是一種鍛煉,在這個極其需要經(jīng)驗(yàn)的行業(yè),倒下的是那些渾渾噩噩的。遇到問題,努力解決,總有柳暗花明時,那時是滿足的喜悅,共勉!
?
轉(zhuǎn)載于:https://www.cnblogs.com/yzcStudy/p/5782267.html
總結(jié)
以上是生活随笔為你收集整理的MVC路由自定义及视图找寻规则的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 引用font-awesome图标库前端显
- 下一篇: C++ 实现自旋锁