这篇关于MVC路由及视图规则本来是由自昨天要发的,但是定义本人真的有点懒,终于今天忍无可忍了。及视初学MVC的图找时候比现在还菜一点(现在也很菜),想着会用就行,寻规但是由自有时还是会好奇,为什么它能找到控制器?定义为什么控制器return View();就能找到视图,而为什么视图一定要建在Views文件下?及视好像说的有点多了,接下来一边上例子,图找一边分析!
MVC路由自定义
相信对于MVC路由的寻规配置大家也都了解过一些,其实,由自这也不是定义本章的重点。
创建MVC项目的及视时候,根目录下>>App_Start>>RouteConfig,图找这个类就是用来配置路由的,开始会有个默认路由。寻规

简单介绍下:***个参数:路由名称(***),第二个参数url:需要注意的是{ controller}、{ action}都是高防服务器相当于占位符。第三个参数则是默认路由了。
场景:当你的控制器需要根据不同功能来分类时,假如需要做不同产品,希望把同一产品的控制器放在一起。可以这样做:
添加一条路由规则:
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 } ); } 注意点:路由规则匹配是从上到下的,优先匹配的路由一定要写在最上面。因为路由匹配成功以后,它就不会继续匹配下去。当然我们创建的控制器目录也得符合才能匹配。

结果:

MVC视图找寻规则
在上面那部分即使我们自定义了路由,但是视图创建的位置还是得乖乖放在Views文件夹下,(不然的话,结果肯定是找不到视图)我们同样也希望View位置是可配。
希望控制器返回的视图能在这个目录下:

①首先,需要写一个类来自定义我们视图的映射规则,这里我就建在App_Start文件夹下,跟其他配置类一起。云服务器
public sealed class MyViewRule:RazorViewEngine { public MyViewRule() { ViewLocationFormats = new string[] { //我们定义的视图找寻规则,和路由配置一样,它是从上往下匹配,如果两个路径下都有着视图,它会展示***个。 "~/ProductViews/AboutPrice/{ 1}/{ 0}.cshtml", //这是默认设置的,觉得用不到可以删掉,{ 1}表示控制器名称,{ 0}表示视图名称 "~/Views/{ 1}/{ 0}.cshtml", "~/Views/Shared/{ 0}.cshtml" }; } } ②然后,需要在全局Global.asax.cs里面注册我们的规则,代码如下:
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //上面是项目创建默认注册的,下面两条:先把原来的规则清空,再把我们设置加上() ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new MyViewRule()); } } 测试结果:

错误: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节点下继承WebViewPage。或者在默认创建Views文件夹下有个Web.config复制到/ProductViews/AboutPrice下。(局部配置文件,就近原则)
<pages pageBaseType="System.Web.Mvc.WebViewPage"> </pages> 结果:
总结
关于MVC怎么找到控制器,控制器怎么匹配视图希望能给有需要的小伙伴一点帮助,也是自己的一个总结,不妥之处,欢迎指正。
程序员在学习的路上永远不要怕遇到问题,这是成长,也是一种锻炼,在这个极其需要经验的行业,倒下的是那些浑浑噩噩的。遇到问题,努力解决,总有柳暗花明时,那时是满足的喜悦,共勉!