按照传统,在很多Web框架中(如经典的ASP、JSP、PHP、ASP.NET等之类的框架),URL代表的是磁盘上的物理文件。例如,当看到请求http://example.com/albums/list.aspx时,我们可以确定该站点目录结构中含有一个albums文件夹,并且在该文件夹下还有一个list.aspx文件。
  URL和文件系统之间这种一一对应的关系并不适用于大部分基于MVC的Web框架,如ASP.NET MVC.一般来说,这些框架采用不同的方法将URL映射到某个类上的方法调用,而不是映射到磁盘上的物理文件。
  另外,对于MVC应用程序,URL 请求到达的第一个组件是控制器而不是视图,而控制器是没有物理路径的

路由机制概述 

1.匹配传入的请求(该请求不匹配服务器文件系统中文件),并将这些请求映射到控制器操作(Controller中的action方法)

MVC基本的处理流程:来了一个URL请求, 从中找到Controller和Action的值, 将请求传递给Controller处理. Controller获取Model数据对象, 并且将Model传递给View, 最后View负责呈现页面。(说白了,就是来了一个URL,找到一个控制器中的方法)(路由是模式,有参数,通过URL中的参数,就可以对应找到符合这种路由模式的方法)

Routing的作用:

´URL: localhost/home/index
´localhost是域名, 所以首先要去掉域名部分: home/index
´对应了上面代码中的这种URL结构: {controller}/{action}/{id}
´因为我们建立了这种URL结构的识别规则, 所以能够识别出 Controller是home, action是index, id没有则为默认值"".
路由机制一般是由路由名称,路由模式和默认值构成的
Defaults属性
最一般的路由情况
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "GlobalIndex", id = UrlParameter.Optional }
);

路由URL模式

默认值

匹配URL模式的实例

{controller}/{action}/{id}

New {id=“”}

/albums/display/123

/albums/display

{controller}/{action}/{id}

New {controller=“home”,

action=“index”,

id=“”}

/albums/display/123

/albums/display

/albums

/

如果一条URL能够匹配就会出错
比如
Test的控制器里有两个action
public ActionResult Index()
public ActionResult Index(int id)
在页面中有一个请求
Test/Index 或者Test/Index/3 都会出错:
  对控制器类型“TestController”的操作“Index”的当前请求在下列操作方法之间不明确:
  类型 MVCDemo.Controllers.TestController 的 System.Web.Mvc.ActionResult Index()
  类型 MVCDemo.Controllers.TestController 的 System.Web.Mvc.ActionResult Index(Int32)
因为在这种最一般的情况下,这条URL能够匹配两条路由,用两个方法都行。也就是说,来了一个URL,到控制器里找到两个方法都可以用。
      这就是控制器方法不能重载的原因
 
注册路由的顺序
    当一个URL请求到达应用程序时,路由引擎将遍历所有已注册的路由,检查请求URL是否和URL模式相匹配,然后根据指定的约束验证检索到的URL参数是否有效。一旦路由引擎找到第一个匹配的路由,就会停止遍历。
´
   因此,路由的注册顺序非常重要,必须按照从最特殊到最通用的顺序注册。
routes.MapRoute("showBlogRoute",
"blog/post/{id}",
new { controller =“CMS”,action = “Show”,id=“”}); routes.MapRoute("blogRoute",
“blog/{action}/{id}",
new { controller = "CMS", action = “Index", id = “”}); routes.MapRoute(“DefaultRoute”, // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id =“”} // 参数默认值
);
    当URL    /blog/post/3  到达应用程序时,路由引擎开始对路由列表进行评估,由于URL和第一个参数路由相匹配,因而停止评估路由。如果按照相反的顺序注册路由,URL将匹配默认的路由,从而调用BlogController中的Post方法,显然就得不到想要的结果
     当路由模式的控制器部分写的是{controller} 时,可以匹配任何URL中的控制器部分,当是blog时,只能匹配 blog/... 的路由
 
Constraints属性
 
 Constraints属性是一个包含针对URL参数的验证规则的字典,就是说,它是用来限定每个参数的规则或Http请求的类型的
 使用正则表达式来定义约束,比如下面的例子,如果希望以正确的格式(只允许数字值)指定年月日
routes.MapRoute("simple",
"archive/{year}/{month}/{day}",
new{controller="blog",action="search",year="",month="",day=""},
new{
year=@"\d{2}|\d{4}",//只能是两位或四位数字
month=@"\d{1,2}",//只能使用一位或两位数字
day=@"\d{1,2}"//只能使用一位或两位数字
});

2.构造传出的URL,用来响应控制器中的操作

    在视图中调用一个方法如Html.ActionLink或Url.Action的方法。 这方法会调用RouteCollection. GetVirtualPath方法,传入参数用于选择正确的路线生成的URL。
  <div>
@Html.ActionLink("点击","Click","Home");
</div>

RouteCollection. GetVirtualPath方法

 返回值类型为VirtualPathData,包含路由关联的 URL 路径的相关信息。
 定义了两个重载函数

方法

说明

GetVirtualPath(RequestContext,RouteValueDictionary)

如果具有指定的上下文和参数值,则返回与路由关联的 URL 路径的相关信息。

GetVirtualPath(RequestContext, String,RouteValueDictionary)

如果具有指定的上下文、路由名称和参数值,则返回与命名路由关联的 URL 路径的相关信息。

第一个方法获得了当前路由的一些信息和用户指定的路由值(字典)去选择目标路由。

1.  路由系统然后会循环整个路由表,通过GetVirtualPath方法向每一个路由发问:“Can you generate a URL given  these parameters?”

2.  如果答案是Yes,那么就会返回一个VirtualPathData实例,包括URL和与匹配相关的一些其他信息。如果答案是NO,则返回一个Null,路由系统会转向下一条路由,直到遍历整个路由表。

举例:

如果我们在路由机制中定义了一个

 routes.MapRoute(
name: "test",
url: "test/look/{id}",
defaults: new { controller = "Home", action = "Click", id = UrlParameter.Optional }
); routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

在视图中写:

    <div>
@Html.ActionLink("测试","look","test");
</div> <div>
@Html.ActionLink("点击","Click","Home");
</div>

最终的结果是 不管点击哪一个按钮,都会触发方法Click

public class HomeController : Controller
{
//
// GET: /Home/ public ActionResult Index()
{
return View();
} public ActionResult Click()
{
return View();
} }

但是显示的URL都是

如果我们在地址栏中直接输入 test/look或者Home/Click 都是正确的。

MVC路由机制的更多相关文章

  1. WebApi-1 与MVC路由机制比较

    在MVC里面,默认路由机制是通过url路径去匹配对应的action方法 public class RouteConfig { public static void RegisterRoutes(Rou ...

  2. asp.net MVC 路由机制

    1:ASP.NET的路由机制主要有两种用途: -->1:匹配请求的Url,将这些请求映射到控制器 -->2:选择一个匹配的路由,构造出一个Url 2:ASP.NET路由机制与URL重写的区 ...

  3. asp.net MVC 路由机制 Route

    1:ASP.NET的路由机制主要有两种用途: -->1:匹配请求的Url,将这些请求映射到控制器 -->2:选择一个匹配的路由,构造出一个Url 2:ASP.NET路由机制与URL重写的区 ...

  4. MVC路由机制(转)

    今天我来缕一下MVC的路由机制,因为使用MVC已经快一年了,之前也只是上手,没有系统去理会.项目完了,结合实际使用,回过头来深入一下. MVC 学习索引(点击即可) 一个请求进入IIS后 传统ASP. ...

  5. Asp.net MVC路由机制

    C:/Windows/Microsoft.NET/Framwork/v4.0.30319/config/web.config-> httpModules-> System.Web.Rout ...

  6. C# 通过反射实现类似MVC路由的机制

    最近封装了个功能非常类似于MVC的路由.//MVC路由机制先找到Controller Action 什么是反射 反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获 得.NET ...

  7. C#进阶系列——WebApi 路由机制剖析:你准备好了吗?

    前言:从MVC到WebApi,路由机制一直是伴随着这些技术的一个重要组成部分. 它可以很简单:如果你仅仅只需要会用一些简单的路由,如/Home/Index,那么你只需要配置一个默认路由就能简单搞定: ...

  8. 【C#】 WebApi 路由机制剖析

    C#进阶系列——WebApi 路由机制剖析:你准备好了吗? 转自:https://blog.csdn.net/wulex/article/details/71601478 2017年05月11日 10 ...

  9. C#进阶系列——WebApi 路由机制剖析:你准备好了吗? 转载https://www.cnblogs.com/landeanfen/p/5501490.html

    阅读目录 一.MVC和WebApi路由机制比较 1.MVC里面的路由 2.WebApi里面的路由 二.WebApi路由基础 1.默认路由 2.自定义路由 3.路由原理 三.WebApi路由过程 1.根 ...

随机推荐

  1. Composite 组合模式

      简介         <大话设计模式>一书中组合模式的定义为:将对象组合成[树]形结构以表示[部分-整体]的层次结构,组合模式使得用户对[单个对象]和对[组合对象]的使用具有一致性. ...

  2. 线程技术 ☞ Future模式

    线程技术可以让我们的程序同时做多件事情,线程的工作模式有很多,常见的一种模式就是处理网站的并发,今天我来说说线程另一种很常见的模式,这个模式和前端里的ajax类似:浏览器一个主线程执行javascri ...

  3. Windows Azure上的Odoo(OpenERP)-2.在Ubuntu虚拟机上部署Odoo(OpenERP)

    创建虚拟机的步骤在这里就不再赘述了,请参考上一篇博文. 首先用下述命令将Ubuntu系统进行更新: 1. sudo apt-get update 2. sudo apt-get upgrade 3. ...

  4. 使用<input>标签做了两个按钮, 按钮之间间距如何去掉

    遇到的问题: 使用<input>标签做了两个按钮, 按钮之间有个间距不知道怎么去掉. 如下图: 问题解决: <input>是内联块状元素(inline-block); 内联元素 ...

  5. animation的6个属性

    @keyframes 规定动画.   animation 所有动画属性的简写属性,除了 animation-play-state 属性.   animation-name 规定 @keyframes ...

  6. c# 学习笔记(二)

    c#3.0 新特性  扩展方法 扩展方法允许编写和声明它的类之外的关联类的方法 用于没有源代码或者类是密封的,需要给类扩展新方法时 1.扩展方法必须被声明为static2.扩展方法声明所在的类必须被声 ...

  7. Swift - 03 - 整数类型

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  8. Hive学习之二 《Hive的安装之自定义mysql数据库》

    由于MySQL便于管理,在学习过程中,我选择MySQL. 一,配置元数据库. 1.安装MySQL,采用yum方式. ①yum  install  mysql-server,安装mysql服务端,安装服 ...

  9. seo小技巧(转载)

    转载自前端网:五行缺火 优化技巧是老师在课堂上教不了你的,而自己也不可能在练习中领悟,最便捷的方法就是听取别人的经验,所以转载一下 SEO要点:1.语义化html标签,用合适的标签嵌套合适的内容,不可 ...

  10. createElement()结合appendChild()的实例

    createElement()作用是在JavaScript中创建一个元素 appendChild()向html元素添加节点 下面是冲浪后改编的例子代码 先插html代码 <body> &l ...