ASP.NET MVC API 路由生成规则
我们都知道调用ASP.NET MVC的某些API函数(诸如:Url.Action、RedirectToAction等)可以生成URL,ASP.NET MVC会根据调用API函数时传入的参数去匹配系统定义的路由(Route),然后通过匹配成功的路由去生成相应的URL。
ASP.NET MVC会依次根据如下三个规则生成URL:
调用ASP.NET MVC API函数时传入的参数信息
当前请求的URL(就是Request.Url)和系统中定义路由匹配(按照路由表定义的顺序,从上往下匹配)后的匹配值
系统定义路由中路由参数的默认值
下面这篇文章通过一个例子来阐述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 路由生成规则的更多相关文章
- asp.net mvc 根据路由生成正确的url
假设存在这样一段路由配置: routes.MapRoute( name: "ProductList1_01", url: "pl/{bigSortId}_{smallSo ...
- ASP.NET Web API路由系统:路由系统的几个核心类型
虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...
- ASP.NET Web API 路由对象介绍
ASP.NET Web API 路由对象介绍 前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了 ...
- ASP.NET Web API 路由
路由系统是请求消息进入ASP.NET Web API消息处理管道的第一道屏障,其根本目的是利用注册的路由表(RouteTable)对请求的URI进行解析以确定目标HttpController和Acti ...
- ASP.NET Web API 框架研究 ASP.NET Web API 路由
ASP.NET Web API 核心框架是一个独立的.抽象的消息处理管道,ASP.NET Web API有自己独立的路由系统,是消息处理管道的组成部分,其与ASP.NET路由系统有类似的设计,都能找到 ...
- ASP.NET Web API路由系统:Web Host下的URL路由
ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...
- 理解ASP.NET MVC的路由系统
引言 路由,正如其名,是决定消息经由何处被传递到何处的过程.也正如网络设备路由器Router一样,ASP.NET MVC框架处理请求URL的方式,同样依赖于一张预定义的路由表.以该路由表为转发依据,请 ...
- asp.net mvc ,asp.net mvc api 中使用全局过滤器进行异常捕获记录
MVC下的全局异常过滤器注册方式如下:标红为asp.net mvc ,asp.net mvc api 注册全局异常过滤器的不同之处 using SuperManCore; using System. ...
- 一百元的智能家居——Asp.Net Mvc Api+讯飞语音+Android+Arduino
大半夜的,先说些废话提提神 如今智能家居已经不再停留在概念阶段,高大上的科技公司都已经推出了自己的部分或全套的智能家居解决方案,不过就目前的现状而言,大多还停留在展厅阶段,还没有广泛的推广起来,有人说 ...
随机推荐
- ecshop前台英文后台中文
方法一:修改init.php文件方法改变ecshop默认语言包 该方法适用于:安装ecshop中文版的站长使用. 1.进入您的后台,按照下图提示,将系统语言选项设为 en_us(英语) ,确定保存. ...
- Selenium2学习-035-WebUI自动化实战实例-033-页面快照截图应用之三 -- 区域截图(专业版)
之前有写过两篇博文讲述了 WebUI 自动化测试脚本中常用的截图方法,敬请参阅如下所示链接: 浏览器显示区域截图 浏览器指定区域截图 那么当需要截取的区域不在浏览器显示窗口范围之内时,之前的方法显然无 ...
- 如何让SQLPLUS实现带日期的时间戳
from http://www.itpub.net/thread-1876506-4-1.html SQL> defineDEFINE _DATE = "20-7月 ...
- jquery中奖实例代码
<!doctype html> <html> <head> <meta http-equiv="Content-Type" content ...
- form表单类标签汇总
<form action="form_action.asp" method="get"> First name: <input type=&q ...
- javascript设计模式学习之五——策略模式
一.策略模式定义: 定义一些列的算法/规则,将它们封装起来,使得它们可以互相替换/组合使用.其目的在于将算法/规则封装起来,将算法/规则的使用与实现分离出来. 通过策略模式,可以减少算法计算过程中大量 ...
- QQ拼音在中文输入下默认英文标点
别小看这个功能, 感觉在写一些技术 Blog 的情况下还是挺有用的. 打开QQ拼音: 输入法设置->基本设置->初始状态->中文状态下使用英文标点.
- 这是我定位的Bug
https://github.com/danielgindi/ios-charts/issues/406
- SQL2008中Merge Into的用法
在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已.下面就是具体的使用说明: 首先是对merge的使用说明: merge ...
- update kernel
1,version 2,command First, verify the current kernel version: $ uname -r 2.6.32-358.el6.x86_64 Befor ...