我们都知道调用ASP.NET MVC的某些API函数(诸如:Url.Action、RedirectToAction等)可以生成URL,ASP.NET MVC会根据调用API函数时传入的参数去匹配系统定义的路由(Route),然后通过匹配成功的路由去生成相应的URL。

ASP.NET MVC会依次根据如下三个规则生成URL:

  1. 调用ASP.NET MVC API函数时传入的参数信息

  2. 当前请求的URL(就是Request.Url)和系统中定义路由匹配(按照路由表定义的顺序,从上往下匹配)后的匹配值

  3. 系统定义路由中路由参数的默认值

下面这篇文章通过一个例子来阐述ASP.NET MVC是怎么通过上面三点来生成URL。

首先我们在MVC系统中定义了如下两个路由

public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
name: "Lang",
url: "Culture/{lang}/{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = }
); routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}

运行ASP.NET MVC项目时,如果我们在浏览器地址栏上输入地址http://localhost/culture/en-us/Home/Index,那么这个地址会匹配上面第一个路由Lang(因为ASP.NET MVC的路由表是从上往下匹配的,如果某个路由匹配成功就不会再往下匹配了)。

如果我们现在在http://localhost/culture/en-us/Home/Index这个地址运行的View上(也就是HomeController下的Index这个View),调用Url.Action生成URL:

<!DOCTYPE html>

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
@Url.Action("DoSomething")
</div>
</body>
</html>

那么我们来看看调用API时,ASP.NET MVC生成URL的步骤:

1.由于在调用API Url.Action时传入了参数DoSomething,所以路由中可以得到参数Action为DoSomething。

Action:DoSomething

2.当前请求的URL是http://localhost/culture/en-us/Home/Index,那么用这个地址从上往下去匹配系统定义的路由,匹配到第一个路由Lang时我们可以得到两个参数信息,Controller为Home,lang为en-us,那么现在我们得到的路由信息有:

Controller:HomeController

Action:DoSomething

lang:en-us

3.由于路由Lang中,我们定义了参数id有默认值123,所以最后我们得到的路由信息如下:

Controller:HomeController

Action:DoSomething

lang:en-us

id:123

现在根据最后得到的路由信息再去从上到下匹配系统定义的路由,那么首先匹配到路由Lang时,MVC发现Lang中每个路由参数现在都有值了,匹配成功,所以根据Lang生成的URL就如下图所示(注意:参数id由于是路由Lang中定义的默认值,所以最后没有在生成的URL中体现出来)

ASP.NET MVC API 路由生成规则的更多相关文章

  1. asp.net mvc 根据路由生成正确的url

    假设存在这样一段路由配置: routes.MapRoute( name: "ProductList1_01", url: "pl/{bigSortId}_{smallSo ...

  2. ASP.NET Web API路由系统:路由系统的几个核心类型

    虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...

  3. ASP.NET Web API 路由对象介绍

    ASP.NET Web API 路由对象介绍 前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了 ...

  4. ASP.NET Web API 路由

    路由系统是请求消息进入ASP.NET Web API消息处理管道的第一道屏障,其根本目的是利用注册的路由表(RouteTable)对请求的URI进行解析以确定目标HttpController和Acti ...

  5. ASP.NET Web API 框架研究 ASP.NET Web API 路由

    ASP.NET Web API 核心框架是一个独立的.抽象的消息处理管道,ASP.NET Web API有自己独立的路由系统,是消息处理管道的组成部分,其与ASP.NET路由系统有类似的设计,都能找到 ...

  6. ASP.NET Web API路由系统:Web Host下的URL路由

    ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...

  7. 理解ASP.NET MVC的路由系统

    引言 路由,正如其名,是决定消息经由何处被传递到何处的过程.也正如网络设备路由器Router一样,ASP.NET MVC框架处理请求URL的方式,同样依赖于一张预定义的路由表.以该路由表为转发依据,请 ...

  8. asp.net mvc ,asp.net mvc api 中使用全局过滤器进行异常捕获记录

    MVC下的全局异常过滤器注册方式如下:标红为asp.net mvc ,asp.net mvc api  注册全局异常过滤器的不同之处 using SuperManCore; using System. ...

  9. 一百元的智能家居——Asp.Net Mvc Api+讯飞语音+Android+Arduino

    大半夜的,先说些废话提提神 如今智能家居已经不再停留在概念阶段,高大上的科技公司都已经推出了自己的部分或全套的智能家居解决方案,不过就目前的现状而言,大多还停留在展厅阶段,还没有广泛的推广起来,有人说 ...

随机推荐

  1. C# HttpWebRequest 绝技

    http://www.sufeinet.com/thread-6-1-1.html 万能框架.分布式......

  2. apt-get -y install中的-y是什么意思?

    是同意的意思.没有 -y的命令也可以执行,系统会提示你是否安装,输入y,回车,就会安装了 apt-get -y install这个指令则是跳过系统提示,直接安装.

  3. Java遇见HTML——JSP篇之JSP基础语法

    一.JSP简介 JSP全名为Java Server Pages,Java服务器端页面,其根本是一个简化的Servlet设计,它实现了在Java中使用HTML标签.Jsp是一种动态网页技术标准,是在服务 ...

  4. D3D标注动态避让

    原来也思考了该如何实现标注动态避让,认为必须得计算字符串所占的大小.如果在屏幕上要计算屏幕象素之类的东西. 今天总算找到了实现方法,在C# WorldWind中的KMLImporter类中有.关键是F ...

  5. python pickle 和 shelve模块

    pickle和shelve模块都可以把python对象存储到文件中,下面来看看它们的用法吧 1.pickle 写: 以写方式打开一个文件描述符,调用pickle.dump把对象写进去 dn = {'b ...

  6. Ubuntu 的基本操作

    1.Linux 常用shell 命令,和之前用过的红帽差不多.开发所有和程序相关的代码.压缩包都在一个名为topeet的用户文件夹里 学习了Linux 的重要命令apt-get,用它来安装软件:在使用 ...

  7. 【转】Tomcat7启动的总过程 (有时间自己写下tomcat8的)

    首先,说明tomcat8和tomcat7的启动过程不一样,这篇是针对tomcat7的. Tomcat启动的总过程 通过上面的介绍,我们总体上清楚了各个组件的生命周期的各个阶段具体都是如何运作的.接下来 ...

  8. java 笔记(2) —— 内部类的作用

    一.内部类简介 个人觉得内部类没多少研究价值,GUI中的事件响应算是非常典型的应用了. Java内部类其实在J2EE编程中使用较少,不过在窗口应用编程中特别常见,主要用来事件的处理.其实,做非GUI编 ...

  9. IntelliJ IDEA 常用设置讲解1

    IntelliJ IDEA 有很多人性化的设置我们必须单独拿出来讲解,也因为这些人性化的设置让我们这些 IntelliJ IDEA 死忠粉更加死心塌地使用它和分享它. 常用设置 IntelliJ ID ...

  10. Effective C++ 5.实现

    //条款26:尽量延后变量的定义式出现的时间 // 1.不仅应该延后变量的定义,更应该直到使用该变量的前一刻为止,甚至应该尝试延后这份定义直到能够给它初始值为止.如果这样,不仅能够避免构造和析构的非必 ...