MVC路由自定义及视图找寻规则

这篇关于MVC路由及视图规则本来是昨天要发的,但是本人真的有点懒,终于今天忍无可忍了。初学MVC的时候比现在还菜一点(现在也很菜),想着会用就行,但是有时还是会好奇,为什么它能找到控制器?为什么控制器return
View();就能找到视图,而为什么视图一定要建在Views文件下?好像说的有点多了,接下来一边上例子,一边分析!

MVC路由自定义

相信对于MVC路由的配置大家也都了解过一些,其实,这也不是本章的重点。

创建MVC项目的时候,根目录下>>App_Start>>RouteConfig,这个类就是用来配置路由的,开始会有个默认路由。

简单介绍下:第一个参数:路由名称(唯一),第二个参数url:需要注意的是{controller}、{action}都是相当于占位符。第三个参数则是默认路由了。

场景:当你的控制器需要根据不同功能来分类时,假如需要做不同产品,希望把同一产品的控制器放在一起。可以这样做:

添加一条路由规则:


  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.          } 

注意点:路由规则匹配是从上到下的,优先匹配的路由一定要写在最上面。因为路由匹配成功以后,它就不会继续匹配下去。当然我们创建的控制器目录也得符合才能匹配。

结果:

MVC视图找寻规则

在上面那部分即使我们自定义了路由,但是视图创建的位置还是得乖乖放在Views文件夹下,(不然的话,结果肯定是找不到视图)我们同样也希望View位置是可配。

希望控制器返回的视图能在这个目录下:

①首先,需要写一个类来自定义我们视图的映射规则,这里我就建在App_Start文件夹下,跟其他配置类一起。


  1. public sealed class MyViewRule:RazorViewEngine 
  2.       { 
  3.           public MyViewRule() { 
  4.    
  5.               ViewLocationFormats = new string[] { 
  6.                   //我们定义的视图找寻规则,和路由配置一样,它是从上往下匹配,如果两个路径下都有着视图,它会展示第一个。 
  7.                   "~/ProductViews/AboutPrice/{1}/{0}.cshtml", 
  8.                   //这是默认设置的,觉得用不到可以删掉,{1}表示控制器名称,{0}表示视图名称 
  9.                   "~/Views/{1}/{0}.cshtml", 
  10.                  "~/Views/Shared/{0}.cshtml" 
  11.              }; 
  12.          } 
  13.      } 

②然后,需要在全局Global.asax.cs里面注册我们的规则,代码如下:


  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.               //上面是项目创建默认注册的,下面两条:先把原来的规则清空,再把我们设置加上() 
  10.              ViewEngines.Engines.Clear(); 
  11.              ViewEngines.Engines.Add(new MyViewRule()); 
  12.          } 
  13.      } 

测试结果:

错误: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> 
  6.     
  7.   <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> 

当然,上面这个办法,有个不好的地方就是每次添加一个视图就得写一次,视图多的话极不方便。我们还可以通过配置文件让它继承WebViewPage

②添加配置文件(web.config),在pages节点下继承WebViewPage。或者在默认创建Views文件夹下有个Web.config复制到/ProductViews/AboutPrice下。(局部配置文件,就近原则)


  1. <pages pageBaseType="System.Web.Mvc.WebViewPage"> 
  2. </pages> 

结果:

总结

关于MVC怎么找到控制器,控制器怎么匹配视图希望能给有需要的小伙伴一点帮助,也是自己的一个总结,不妥之处,欢迎指正。

程序员在学习的路上永远不要怕遇到问题,这是成长,也是一种锻炼,在这个极其需要经验的行业,倒下的是那些浑浑噩噩的。遇到问题,努力解决,总有柳暗花明时,那时是满足的喜悦,共勉!

作者:逆光下的微笑丶yzc

来源:51CTO

时间: 2024-08-08 16:01:13

MVC路由自定义及视图找寻规则的相关文章

mvc路由规则,做伪静态

问题描述 mvc路由规则,做伪静态 在路由规则里,写了这样几条规则: //分类路由 routes.MapRoute("category", "list/{filterAttr}-{cateId}-{brandId}-{filterPrice}-{onlyStock}-{sortColumn}-{sortDirection}-{page}.html", new { controller = "catalog", action = "cat

AngularJS入门教程之路由与多视图详解_AngularJS

在这一步,你将学习如何创建一个布局模板并且通过路由功能来构建一个具有多个视图的应用. 请重置工作目录: git checkout -f step-7 注意到现在当你转到app/index.html时,你会被重定向到app/index.html#/phones并且相同的手机列表在浏览器中显示了出来.当你点击一个手机链接时,一个手机详细信息列表也被显示了出来. 步骤6和步骤7之间最重要的不同在下面列出.你可以在GitHub里看到完整的差别. 多视图,路由和布局模板 我们的应用正慢慢发展起来并且变得逐

ASP.NET Core MVC之ViewComponents(视图组件)知多少?

前言 大概一个来星期未更新博客了,久违了各位,关于SQL Server性能优化会和ASP.NET Core MVC穿插来讲,如果你希望我分享哪些内容可以在评论下方提出来,我会筛选并看看技术文档来对你的内容进行解答,借此希望我们能共同进步和学习.本节我们来讲讲ASP.NET Core  MVC中的视图组件. Web应用程序下管理ViewComponents 我是奔着项目用到了哪些就会去写对应的技术博客,在我们项目中利用视图组件来加载权限菜单,这一块是我老大所做,我也就粗略看了看使用方法并未深入借此

MVC路由的问题

问题描述 MVC路由设置里是否可以在controller前面加变量例:routes.MapRoute("Default1",//路由名称"{username}/{controller}/{action}/{id}",//带有参数的URLnew{username="",controller="Home",action="Index",id=UrlParameter.Optional},//参数默认值null,

Apache Geronimo和Spring框架,第6部分:Spring MVC:使用Web视图技术

简介:本教程是系列教程(共六部分)的最后一部分,向您展示了如何利用 Spring 框架来使用 JavaServer Page(JSP).Velocity.Tile 和 PDF 导出功能.您将用 Model-View-Controller (MVC)中的 V 做试验,即 Spring MVC 中内置的各种 Web 视图.通过对 Spring MVC 所支持的各种视 图技术的全面介绍,您将看到在整个系列教程中构建的样例电话本应用程序中实现这些技术有多么轻松. 开始之前 本系列教程适合于需要了解 Sp

如何自定义Excel视图模式

为了将工作表中特定的显示设置(如行高.列宽.单元格选择.筛选设置和窗口设置等)和打印设置(页边距.纸张大小.页眉和页脚以及工作表设置等)保存在特定的视图中,用户可在设置后自定义视图模式,其具体操作为: 在"视图"选项卡的"工作簿视图"组中单击"自定义视图"按钮,如图所示: 在打开的"视图管理器"对话框中单击"添加"按钮,打开"添加视图"对话框,在其中的"名称"文本框中

Win8系统IE11浏览器自定义阅读视图样式教程

  关闭阅读视图时的网络文章 打开阅读视图时的网络文章 自定义阅读视图样式 1.从屏幕右边缘向中间轻扫,然后点击"设置". (如果使用的是鼠标,可以将鼠标移动至屏幕右下角,再向上移动,单击"设置"按钮.) 2.轻触或点击"选项"按钮,并在"阅读视图"下选择字体样式. 可供选择的阅读视图样式 相信大家也看得出来,这个阅读视图包括了适合夜晚观看的样式,着实提高了不少阅读体验.此外,Win8系统下的IE11浏览器不仅能够设置阅读视图

mvc3-我想通过mvc路由,把一个请求的图片地址返回别个网站的,能否实现呢

问题描述 我想通过mvc路由,把一个请求的图片地址返回别个网站的,能否实现呢 比如别人请求的 ,我在mvc中做一个路由,想把 http://www.abc.com/upload/123.jpg 在路由上变成 http://img.abc.com/upload/123.jpg routes.MapRoute( "getImg", // 路由名称 "upload/{strPath}.jpg", // 带有参数的 URL new { controller = "

xml-在布局中怎么使用自定义的视图

问题描述 在布局中怎么使用自定义的视图 这个我创建的视图类: public final class MyView extends View { public MyView(Context context, AttributeSet attrs) { super(context, attrs); [...] } [...] } 然后我想把这个视图放在layout.xml中使用: <?xml version="1.0" encoding="utf-8"?>