Identifier)代表联合资源标识符。routing系统可以为您创造任何你想要的URLs模式。

事例引入

Adam Applied ASP.NET 4 in Context

 先看看如下例子,你可知全知晓啊?

1 介绍Routing系统

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 using System.Web.Routing;
 7 
 8 namespace MVCDemo
 9 {
10     public class RouteConfig
11     {
12         public static void RegisterRoutes(RouteCollection routes)
13         {
14             routes.MapMvcAttributeRoutes();//特性路由
15 
16             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");//忽略资源文件
17 
18             routes.MapRoute(
19                 name: "Default",//路由名,唯一
20                 url: "{controller}/{action}/{id}",//路由URL
21                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },//路由URL默认值
22                 namespaces: new[] { "MVCDemo.Controllers" },//命名空间避免二义性
23                 constraints: new { id = @"^\d*$" }//约束
24 
25                 );
26         }
27     }
28 }

每当引入MVC之前,ASP.NET假定被请的URLs和服务器硬盘上之文书中具有直接关乎。服务器的任务是起浏览器接受请求,从相应文件分发请求。

注:该例子没有加入区域

这种工作办法只是用以及Web
Forms,每个ASPX页面还是一个文本,它来独立的答问请的应和。

1 URI、URL与URN

一旦拍卖MVC
URLs,ASP.NET平台是用routing系统。在及时回,我们展示什么设置以及采用routing系统,来创造强大且灵巧的URL处理。routing系统可以吃你创造任何你想使之URLs模式,将他们知晓,简明的法门表达出来。

 1.1 URI、URL和URN定义 

routing系统有一定量只力量:

     URI(Uniform Resource
Identifier)代表统一资源标识符,标识资源的字符串;

  • 反省进入的URL
    1100.210,并估计起被请的controller和action。当我们收起至客户端请求,这是您想吃routing系统做的。
  • 扭转外向的URLs。

     URL (Uniform Resource
Locator)代表联合资源定位符,互联网上标准资源的地址;

以本章的首先局部,我们会关注定义routes,并使用它处理上的URLs,这样我们能够抵达controller和action。我们见面来得如何使这些routes生成要以HTML上显得的外向URLs

     URN(Uniform Resources
Name)代表统一资源名称,互联网上资源的名;

尽管ASP.NET MVC框架需要routing系统,但是也会用于其它ASP.NET技术,包括Web
Forms。因此,routing系统类让配于System.Web,而非是System.Web.Mvc。

 1.2 URI、URL和URN三者之间的关联图

当你创造一个初的MVC应用,你晤面盼VS已经上加了System.Web.Routing装配的援。

图片 1

1.1 创建Routing项目

1.3 对URI、URL和URN三者之间解析

若果显示routing系统,我们需要一个品种,来填补加routes。使用Internet
Application模板创建一个新的MVC应用,叫做UrlsAndRoutes。我们选这个模板,是盖她给我们有的备的controller和action。

      本解析基于1.2
URI、URL和URN三者之间的关联图。

Routes被定义在Global.asax.cs中,它是Global.asax的后端代码文件。

     
(1)从命名角度,URI标识资源都唯一,URL标识资源地址
,URN标识资源名称;

用第一不成始发经常,底层ASP.NET平台调用Application_Start方法,这致使RegisterRoutes方法为调用。这个措施的参数是静态属性RouteTable.Routes的价值,它是RouteCollection类的实例。

     
(2)从数学关系:URI=URL+URN+URL∩URN;很轻见到,URL一定是URI,但URI不必然是URL,同理,URN一定是URI,但URI不自然是URN;

咱得以去从RegisterRoutes方法默认为抬高的routes,因为我们怀念只要显得一系列底技巧,来创造路由和可用之不同类别的路由。

1.4 URL应享特色

1.3 介绍URL模式

     (1)  域名好记忆与拼写;

Routing系统不可思议地以同一组routes工作。这些routes共同做程序的URL
schema或scheme,它是先后会识别或襄阳之相同组URLs。

     (2)  简短;

公不需要手动地发出每个URLs。每个route包含一个URL模式,它之所以来比上的URL。如果模式匹配URL,routing系统用她来会处理URL。

     (3)  便于输入;

1 http://mysite.com/Admin/Index

     (4)  可以体现来站点布局;

URLs可以吃分隔成有,通过/分隔。这个URLs包括一个域名,两个组成部分的片。我们只要拿其表达也程由于系统可理解的干。这个URL模式是

     (5)
 应该是“可破解的”,用户可透过移除URL的最后,进而到达更胜层次之音体系布局;

1 {controller}/{action}

     (6)  持久、不能够更改

当处理一个进入的URL,路由于网的工作是匹配URL到模式,然后因模式面临的概念,为有变量提取URL的价。片段变量使用花括号{}表达,例子中出半点单有变量,controller和action。

1.5  小结

咱们用相当到一个模式,因为MVC应用汇总是有许多routes,路由于系统会于上的URL到URL模式之每个route,直到其发现匹配。

     
 通常情况下,URI代表同意资源标识符(Uniform Resource
Identifier)。URI是标识了一个资源的字符串。从技术角度看,所有URL都是URI。W3C认为“URL是一个业余的概念,但其杀有效:URL是URI的一样栽档次,它通过代表本身的重大走访机制来标识资源”,换句话说,URI是某种资源的标识符,而URL则也得到该资源提供了实际的音信。

总长由于系统尚未其它controller和action的定义。它只是吧有变量提取值,并传递他们交要管线。当求了抵达MVC框架,会进去管线,指派controller和action变量。这是为何路由于系统可以据此当Web
Form,并且可以创建好之变量。

     
 注释:资源是一个抽象概念,既好依靠一个文本,也得因道调用的结果还是服务器上之一对别样内容。

默认地,URL模式会配合任何发生不易有数量之URL。例如,示例的模式会配合任何有点儿单部分的URL。

2 路由于概述(传统路由)

Request URL Segment Variables
http://mysite.com/Admin/Index controller=Admin
action=Index
http://mysite.com/Index/Admin controller=Index
action=Admin
http://mysite.com/Apples/Oranges controller=Apples
action=Oranges
http://mysite.com/Admin 不匹配,片段太少
http://mysite.com/Admin/Index/Soccer 不匹配,片段太多

2.1  WebForm URL与Route URL

 

   
 (1)WebForm中,对URL的流传请求通常映射到磁盘上的情理文件,如.aspx文件。例如对http://server/application/Product.aspx?id=4的请求映射到名为Products.aspx文件,该文件包含代码和标记用于呈现对浏览器的响应,一般请求示过程抽象如下:

  • URL模式是因循守旧的,会配合有同样片段数量之URLs。
  • URL模式是随便之,如果URL有着不错有数量,模式会为一些变量提取值

   
 图片 2

当即是默认的所作所为,是知道URL模式成效的要。我们干了,路由于系统非明了其他关于MVC应用,所以URL提出来的值没有响应的controller或action,URL模式会配合。

     (2)ASP.NET
MVC中,通常地,URL映射并非映射到具体磁盘上的物理文件,这是根据ASP.NET路由于特性,主要发生少个过程,即URL映射和URL生成(接下去讲解)。在ASP.NET路由于丁,您得定义URL模式,该模式涵盖在拍卖URL请求时用的价的挤占位符。在运作时,运用程序名称后的URL部分因你所定义之URL模式分析为离开散值。例如,在求http://server/application/Products/show/beverages时,路由分析器可以将值Products、show和beverages传递给请求的处理程序。相反,在一个不由URL路由管理的请求中,/Products/show/beverages片段将被解释为运用程序中的一个文件的路径。
  

3 创建并报一个简练的Route

2.2  ASP.NET 路由与 URL 重写

1 publicstaticvoid
RegisterRoutes(RouteCollection routes) { 2 3
Route myRoute =new
Route(“{controller}/{action}”,
new MvcRouteHandler()); 4
routes.Add(“MyRoute”,
myRoute); 5 }

        ASP.NET 路由不同于其它 URL
重写方案。URL 重写通过当将请发送到网页之前实际更改 URL
来拍卖传入请求。例如,一个运用 URL 重写的应用程序可能会见以 URL 从 /Products/Widgets/ 更改为 /Products.aspx?id=4。此外,URL 重写通常没有对应的 API
来创造基于模式之 URL。在 URL 重写着,如果更改了 URL
模式,则要手动更新包含原始 URL 的持有超链接。由于
ASP.NET 路由得以起 URL 提取值,所以拍卖传入请求时不又改
URL。如果要创造一个 URL,则拿参数值传递及啊汝生成 URL
的章程被。若使还改 URL
模式,请以某位置变动该模式,您于应用程序中创造的依据该模式的具备链接以机关使用新模式。

比方心理有一个URL模式,你可以运用它定义一个router。我们创建了一个新的route对象,将我们的URL模式传入构造参数。我们为传递一个MvcRouteHandler的实例。不同的ASP.NET技术提供不同之好像来缝合route。我们以Add方法将她上加至RouteCollection对象,传递一个深受他打底名字,并传递我们创建的route。

2.3  路由定义

于routes起名字是可选的,这有一个晤牺牲整齐的关注点分离之routing。我们见面解释在怎么会成为一个题目。

        A route is a URL pattern that is mapped to a handler.
The handler can be a physical file, such as an .aspx file in a Web Forms
application. A handler can also be a class that processes the request,
such as a controller in an MVC application. To define a route, you
create an instance of the Route class by specifying the URL pattern, the
handler, and optionally a name for the route.

报routes更自在的艺术,是采取RouteCollection类中定义之MapRoute方法。

     
 译文:路由于是同样种为射到有处理程序的URL模式。处理程序可能是一个大体文件,如以WebForms运用程序中的aspx文件。处理程序也说不定是一个甩卖要的好像,如MVC应用程序中之控制器。要定义路由,您得透过点名URL模式、处理程序和途径的称号来创造路由类的实例。

1 routes.MapRoute(“MyRoute”,”{controller}/{action}”)

      You add the route to the
application by adding the Route object to the static Routes property of
the RouteTable class. The Routes property is a RouteCollection object
that stores all the routes for the application.You typically do not have
to write code to add routes in an MVC application. Visual Studio project
templates for MVC include preconfigured URL routes. These are defined in
the MvcApplication class, which is defined in the
Global.asax file.

MapRoute方法只有出MVC应用被有。ASP.NET Web
Forms应用中来一个一律定义在RouteCollection类中之MapPageRoute方法。

     
译文:你可经过将路由对象上加到RouteTable类的静态路由属性被之方式将行程由于补缺加至应用程序中。路由于属性是一个吧应用程序存储所有路由的路由对象。在MVC应用程序中,您便不需编制代码来填补加路鉴于。VS项目模板也MVC包含了事先布置的URL路由。这些都是当MvcApplication类中定义的,被定义在Global.asac
文件被。

3.1 测试进入URLS的单元测试

2.4 URL Patterns(URL模式)

我们记忆,你单元测试routes,确保他们像预想的那样处理上的URLs。在一个施用中,URL架构会相当复杂,很易创建有飞的结果。

A URL pattern can contain literal values
and variable placeholders (referred to as URL
parameters). The literals and placeholders are located in segments of the URL which are delimited by the slash
(/) character.

在前面的章,我们回避创建一个共用的helper方法。本章,我们转移做法。测试一个用到之路由架构需要充分地开,当你可知以一个单一的办法中分众批测试,使用helper方法会变得简单。

译文:URL模式或者含文字值和变量占位符(称为URL参数)。文字和占位符位于URL的有被,由斜杠(/)字符分隔。

俺们得mock三个近乎:HttpRequestBase,HttpContextBase,HttpResponseBase。这三只类似位居一块儿,重建了行程由于网的MVC基础设备。

When a request is made, the URL is parsed
into segments and placeholders, and the variable values are provided to
the request handler. This process is similar to the way the data in
query strings is parsed and passed to the request handler. In both cases
variable information is included in the URL and passed to the handler in
the form of key-value pairs. For query strings both the keys and the
values are in the URL. For routes, the keys are the placeholder names
defined in the URL pattern, and only the values are in the URL.

译文:当发出请求时,URL被解析为一些和占有位符,且变量值被提供于要处理程序。这个历程看似于查询字符串中之数目为分析并传递给告处理程序的方式。在当时半种植情形下,变量信息还饱含在URL中,并以键值对之款型传递让处理程序。对于查询字符串,键和价值都当URL中。对于路由,键是URL模式中定义的占位符名称,在URL中只是价值。

In a URL pattern, you define placeholders
by enclosing them in braces ( { and } ). You can define more than one
placeholder in a segment, but they must be separated by a literal value.
For example, {language}-{country}/{action} is a valid
route pattern. However, {language}{country}/{action} is not a valid pattern,
because there is no literal value or delimiter between the placeholders.
Therefore, routing cannot determine where to separate the value for
the language placeholder from the value for the country placeholder.

译文:在URL模式遭遇,通过以它封装于括号(以及)中来定义占位符。您得以一个截被定义多单占位符,但是必须用文字值分隔它们。例如,语言-国家/行动是相同种植有效的门路模式。然而,语言国家/action不是一个管用之模式,因为占用位符之间从未文字值或分隔符。因此,路由于未可知操纵拿语言占位符的价与国占位符的值分隔开。

The following table shows valid route
patterns and examples of URL requests that match the patterns.

下表显示了中之路由模式以及和模式匹配的URL请求示例。

图片 3

 Typical URL Patterns in MVC
Applications

译文:MVC运用程序中的经模式

 URL patterns for routes in MVC
applications typically include {controller} and {action} placeholders.

译文:在MVC运用程序中,路由于URL模式通常含控制器和动作占位符。

When a request is received, it is routed
to the UrlRoutingModule object and then to the MvcHandler HTTP handler.
The MvcHandler HTTP handler determines which controller to invoke by
adding the suffix “Controller” to the controller value in the URL to
determine the type name of the controller that will handle the request.
The action value in the URL determines which action method to
call.

译文:当接过及一个求时,它吃路由于至UrlRoutingModule对象,然后发送到MvcHandler
HTTP处理程序。MvcHandler
HTTP处理程序通过向URL中之决定器值添加后缀“控制器”来确定要调用哪个控制器,以确定控制器的门类名称,该控制器将处理要。URL中之操作值决定调用哪个操作方法。

For example, a URL that includes the URL
path /Products is mapped to a controller named ProductsController. The value in the action parameter is the name of the action method that
is called. A URL that includes the URL path /Products/show would result in a call to the Showmethod of the ProductsController class.

译文:例如,一个带有URL路径  /产品
的URL映射到一个名叫也ProductsController的控制器。action参数中之值是调用的操作方法的名称。一个富含URL路径
  /产品/show
 的URL会促成对ProductsController类的Showmethod的调用。

The following table shows the default URL
patterns, and it shows examples of URL requests that are handled by the
default routes.

译文:下表显示了默认的URL模式,它显得了由默认路是因为拍卖的URL请求的演示。

 图片 4

The route with the pattern {resource}.axd/{*pathInfo} is included to prevent requests
for the Web resource files such as WebResource.axd or ScriptResource.axd
from being passed to a controller.

For IIS 7.0, no file-name extension is
needed. For IIS 6.0, you must add the .mvc file-name extension to the
URL pattern, as in the following example:

译文:带有模式资源的路由axd/pathInfo,被用于防止Web资源文件之求,例如WebResource,axd或ScriptResource传递至控制器。对于IIS
7.0,不待另文件名称扩展。对于IIS
6.0,您要上加.mvc文件扩展名到URL模式被,如下面的例子:

 图片 5

 如以VS2013使用MVC模板创建项目时,自动生成类RouteConfig.

图片 6

2.5 Adding Routes to a Web Forms
Application(添加路出于至WebForm运用程序)

In a Web Forms application, you create
routes by using the MapPageRoute(String, String, String) method of the
RouteCollection class. The MapPageRoute method creates a Route object
and adds it to the RouteCollection object. You specify properties for
the Route object in parameters that you pass to the MapPageRoute
method.

译文:在Web
Forms应用程序中,您得利用路由于精选类似的MapPageRoute(字符串、字符串、字符串)方法创建路由于。MapPageRoute方法创建一个路由对象并以该加加至RouteCollection对象。您可在传递给MapPageRoute方法的参数中指定路由对象的性。

Typically, you add routes in a method
that is called from the handler for the Application_Start event in the
Global.asax file. This approach makes sure that the routes are available
when the application starts. It also enables you to call the method
directly when you unit-test the application. If you want to call a
method directly when you unit-test the application, the method that
registers the routes must be static (Shared in Visual Basic) and must
have a RouteCollection parameter.

译文:通常地,在大局Global.asax文件被,您可当一个叫做Application_Start
方法里上加路由于。该方法确保当应用程序启动时,路由于是得使的。它还而你可以对应用程序进行单元测试时直接调用该办法。如果您想以针对应用程序进行单元测试时直接调用方法,那么注册路由的主意必须是静态的(在Visual
Basic中凡是共享的),并且要具备一个路由参数。

The following example shows code from a
Global.asax file that adds a Route object that defines two URL
parameters named action and categoryName. URLs that have the specified
pattern are directed to the physical page named Categories.aspx.

译文:下面的演示展示了来自.Globalasax文件的代码,该代码添加了一个路由对象,该目标定义了零星单名叫吧action和类称号的URL参数。具有指定模式的url被定向到叫也分类.aspx的大体页面。

protected void Application_Start(object sender, EventArgs e)
{
    RegisterRoutes(RouteTable.Routes);
}

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapPageRoute("",
        "Category/{action}/{categoryName}",
        "~/categoriespage.aspx");
}

2.6 Adding Routes to an MVC
Application

 If you adopt the MVC convention of
implementing controllers by creating classes that derive from the
ControllerBase class and giving them names that end with “Controller”,
you do not need to manually add routes in an MVC application. The
preconfigured routes will invoke the action methods that you implement
in the controller classes.

译文:如果你通过创建于控制器基类派生的近乎来兑现控制器的MVC约定,并受它们盖“控制器”结尾的名号,那么您尽管无欲以MVC应用程序中手动添加路出于了。预配置的路由将调用您当支配器类中贯彻之操作方法。

If you want to add custom routes in an
MVC application, you use the MapRoute(RouteCollection, String, String)
method instead of the MapPageRoute(String, String, String)
method.
译文:如果你想当MVC应用程序中上加于定义路由,您可以动用MapRoute(RouteCollection、String、String)方法,而休是MapPageRoute(字符串、字符串、字符串)方法。

The following example shows the code that
creates default MVC routes in the Global.asax file, as defined in the
Visual Studio project template for MVC applications.

 译文:下面的事例展示了在大局中创造默认MVC路由的代码。asax文件,正使以Visual
Studio项目模板被定义的MVC应用程序。

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default",                                              // Route name 
            "{controller}/{action}/{id}",                           // URL with parameters 
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

    }

    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
    }
}

2.7 Setting Default Values for URL
Parameters(为URL参数设置默认值)

When you define a route, you can assign a
default value for a parameter. The default value is used if a value for
that parameter is not included in the URL. You set default values for a
route by assigning a dictionary object to the Defaults property of the
Route class. The following example shows how to add a route that has
default values, by using the MapPageRoute(String, String, String,
Boolean, RouteValueDictionary) method.

译文:当你定义一个路由时,您可吗一个参数指定一个默认值。如果该参数的值没有含在URL中,则运用默认值。通过以dictionary对象分配受route类的默认属性,可以呢行程由于设置默认值。下面的例证展示了哪些通过采用MapPageRoute(字符串、字符串、字符串、布尔值、RouteValueDictionary)方法上加具有默认值的路由。

void Application_Start(object sender, EventArgs e) 
{
    RegisterRoutes(RouteTable.Routes);
}

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapPageRoute("",
        "Category/{action}/{categoryName}",
        "~/categoriespage.aspx",
        true,
        new RouteValueDictionary 
            {{"categoryName", "food"}, {"action", "show"}});
}

When ASP.NET routing handles a URL
request, the route definition shown in the example (with default values
of food for categoryName and showfor action) produces the results that
are listed in the following table.

图片 7

For MVC applications, overloads of the
RouteCollectionExtensions.MapRoute method, such as
MapRoute(RouteCollection, String, String, Object, Object), enable you to
specify defaults.

2.8 Handling a Variable Number of Segments
in a URL Pattern(在URL模式中拍卖可转换多少的段子)

Sometimes you have to handle URL requests
that contain a variable number of URL segments. When you define a route,
you can specify that if a URL has more segments than there are in the
pattern, the extra segments are considered to be part of the last
segment. To handle additional segments in this manner you mark the last
parameter with an asterisk (*). This is referred to
as a catch-all parameter. A route with a
catch-all parameter will also match URLs that do not contain any values
for the last parameter. The following example shows a route pattern that
matches an unknown number of segments.

译文:有时你要处理包含一个不过转换多少的URL段的URL请求,其中。当你定义一个路由时,您可指定,如果一个URL的一部分比模式受到生再度多的段落,那么额外的段子被认为是最终一局部的同一片。要因为这种方法处理额外的段子,您得用星号(*)标记最后一个参数。这给称之为一个含糊的参数。一个富含有参数的路由也拿相当不分包最后一个参数的任何值的url。下面的以身作则展示了一个相当未知数量的段子的路由模式。

/ query / { queryname } { * queryvalues
}

When ASP.NET routing handles a URL
request, the route definition shown in the example produces the results
that are listed in the following table.

译文:当ASP.NET路由于拍卖一个URL请求时,示例中所出示之路由定义有了下表中列有之结果。

图片 8

2.9  Adding Constraints to
Routes(为行程由于长律)

In addition to matching a URL request to
a route definition by the number of parameters in the URL, you can
specify that values in the parameters meet certain constraints. If a URL
contains values that are outside the constraints for a route, that route
is not used to handle the request. You add constraints to make sure that
the URL parameters contain values that will work in your
application.

译文:除了通过URL中参数的数来匹配URL请求他,还好指定参数中之值满足一定的律规范。如果一个URL包含的价超出了路由的羁绊,那么该路由就未会见被用于拍卖要。您加加了一部分约束,以保URL参数包含在您的应用程序中劳作的价值。
Constraints are defined by using regular
expressions or by using objects that implement the IRouteConstraint
interface. When you add the route definition to the Routes collection,
you add constraints by creating a RouteValueDictionary object that
contains the verification test. The key in the dictionary identifies the
parameter that the constraint applies to. The value in the dictionary
can be either a string that represents a regular expression or an object
that implements the IRouteConstraint interface.

译文:约束是透过应用正则表达式或利用实现IRouteConstraint接口的对象来定义之。当以行程由于定义添加到路由集合时,通过创建一个暗含验证测试的RouteValueDictionary对象来添加约束。字典中之键标识约束下至的参数。字典中之值好是意味着正则表达式的字符串,也得以是实现IRouteConstraint接口的靶子。
If you provide a string, routing treats
the string as a regular expression and checks whether the parameter
value is valid by calling the IsMatch method of the Regex class. The
regular expression is always treated as case-insensitive. For more
information, see .NET Framework Regular Expressions.

译文:如果您提供一个字符串,那么路由于用字符串作为一个正则表达式来拍卖,并透过调用Regex类的IsMatch方法检查参数值是否行得通。正则表达式总是被视为不分轻重缓急写的。要询问又多信息,请参见。净框架正则表达式。
If you provide an IRouteConstraint
object, ASP.NET routing checks whether the parameter value is valid by
calling the Match method of the IRouteConstraint object. The Match
method returns a Boolean value that indicates whether the parameter
value is valid.

译文:如果您提供一个IRouteConstraint对象,ASP.NET
路由经调用IRouteConstraint对象的相当方法,
以之来检查参数值是否管用。Match方法返回一个布尔值,该值表示参数值是否中。
The following example shows how to use
the MapPageRoute method to create a route that has constraints that
limit what values can be included in the locale and year parameters. (In
an MVC application, you would use the MapRoute method.)

译文:下面的言传身教展示了怎么使用MapPageRoute方法创建同漫长路,该路由限制了所在和年参数中可蕴涵的价。(在MVC应用程序中,您将下map路由艺术。)

 

 1 public static void RegisterRoutes(RouteCollection routes)
 2 {
 3     routes.MapPageRoute("",
 4         "Category/{action}/{categoryName}",
 5         "~/categoriespage.aspx",
 6         true,
 7         new RouteValueDictionary 
 8             {{"categoryName", "food"}, {"action", "show"}},
 9         new RouteValueDictionary 
10             {{"locale", "[a-z]{2}-[a-z]{2}"},{"year", @"\d{4}"}}
11        );
12 }

When routing handles a URL request, the
route definition shown in the previous example produces the results that
are listed in the following table.

图片 9

 2.10 Scenarios When Routing Is Not
Applied(不应用路由时之情景)

Under
some circumstances, ASP.NET routing does not handle a request even when
is enabled for the Web site. This section describes some scenarios in
which routing does not handle the request.

译文:在好几情况下,即使以Web站点启用时,ASP.NET
路由为非处理要。本有的讲述了有的景象,其中路由于未处理要。

A Physical File is Found that Matches
the URL Pattern(找到与URL模式匹配的物理文件)

By default, routing does not handle
requests that map to an existing physical file on the Web server. For
example, a request for
http://server/application/Products/Beverages/Coffee.aspx is not handled
by routing if a physical file exists at Products/Beverages/Coffee.aspx.
Routing does not handle the request even if it matches a defined
pattern, such as {controller}/{action}/{id}.

译文:默认情况下,路由于不处理映射到Web服务器上现有物理文件之乞求。例如,如果有 Products/Beverages/Coffee.aspx.物理文件,请求http://server/application/Products/Beverages/Coffee.aspx
不给路由于拍卖。即使其与已定义之模式相兼容,路由于不处理要,例如控制器/动作/id。
If you want routing to handle all
requests, even requests that point to files, you can override the
default behavior by setting the RouteExistingFiles property of the
RouteCollection object to true. When you set this value to true, all
requests that match a defined pattern are handled by routing.

译文:如果您想使路由于拍卖所有请求,甚至对文件之请求,您可经设置RouteCollection对象的性能RouteExistingFiles为true, 
以之来覆盖默认值。当你将这个价值设置也true时,匹配定义模式的富有请求都由路由于拍卖。

Routing Is Explicitly Disabled for a
URL Pattern(为URL模式显式禁用路由)

You can
also specify that routing should not handle certain URL requests. You
prevent routing from handling certain requests by defining a route and
specifying that the StopRoutingHandler class should be used to handle
that pattern. When a request is handled by a StopRoutingHandler object,
the StopRoutingHandler object blocks any additional processing of the
request as a route. Instead, the request is processed as an ASP.NET
page, Web service, or other ASP.NET endpoint. You can use the
RouteCollection.Ignore method  

译文:您还得指定路由于未应处理某些URL请求。通过定义一条路由,并点名StopRoutingHandler类应该用于拍卖该模式,从而避免了拍卖某些请求的路由。当一个StopRoutingHandler对象处理要时,StopRoutingHandler对象会卡住请求作为路由的外附加处理。相反,请求是作ASP.NET
页面来处理的,网络页面,Web服务,或其他ASP.NET端点。您得利用 RouteCollection.Ignore方法。

1 public static void RegisterRoutes(RouteCollection routes)
2 {
3   routes.Ignore("{resource}.axd/{*pathInfo}");
4 }

2.11 How URLs Are Matched to
Routes(url如何和程由于相当)

When routing handles URL requests, it
tries to match the URL of the request to a route. Matching a URL request
to a route depends on all the following conditions:

译文:当路由拍卖URL请求时,它尝试将请的URL与程由于相当。将URL请求匹配到路由取决于以下原则:

  • The route patterns that you have
    defined or the default route patterns, if any, that are included in
    your project type. 

  • 译文:您曾经定义之路由模式要默认的路由模式,如果有的话,它们含有在您的品类项目中。

  • The order in which you added them to
    the Routes collection.
  •  译文:您将其增长到路由集合的依次。

  • Any default values that you have
    provided for a route.

  • 译文:您吗某路由提供的其余默认值。
  • Any constraints that you have
    provided for a route.

  • 译文:您也路径所提供的另外自律。

  • Whether you have defined routing to
    handle requests that match a physical file.

  • 译文:是否定义了路程由于来拍卖及物理文件匹配的乞求。

For example, suppose that you add routes
with the following patterns:

译文:例如,假而您加加了以下模式:
   Route 1 is set to
{controller}/{action}/{id}

   译文:
路径1设置为{controller}/{action}/{id}
   Route 2 is set to
products/show/{id}

 
译文:路线2设置为 products/show/{id}
Route 2 will never handle a request
because Route 1 is evaluated first, and it will always match requests
that could also work for Route 2. A request for
http://server/application/products/show/bikes seems to match Route 2
more closely, but it is handled by Route 1 with the following
values:
controller is products.
action is show.
id is bikes.

译文:

路由2永远不见面处理要,因为路由于1首先被匹配,它总是匹配可能于2声泪俱下路上干活之呼吁。请求http://server/application/products/show/bikes似乎比赛路线2更紧密,但它是由路线1以下值:

控制器products.

行动是show.

id是bikes.

Default values are used if a parameter is
missing from the request. Therefore, they can cause a route to match a
request that you did not expect. For example, suppose that you add
routes with the following patterns:
Route 1: {report}/{year}/{month}, with
default values for year and month.
Route 2: {report}/{year}, with a default
value for year.
Route 2 will never handle a request.
Route 1 might be intended for a monthly report, and Route 2 might be
intended for an annual report. However, the default values in Route 1
mean that it will match any request that could also work for Route
2.

译文:

倘请被缺少一个参数,则采用默认值。因此,它们可导致同久匹配您没有预料到的恳求的路由。例如,假而您加加了以下模式:

路线1:报告/年/月,年和月默认值。

路2:报告/年,年默认值。

路由2永远不会见处理要。第1长条可能是本着每月报告的,而行程由于2或者是指向年度报告的。但是,路由于1遭受之默认值意味着她用配合任何可能用于路由2的呼吁。

You can avoid ambiguity in the patterns
by including constants, such as annual/{report}/{year} and
monthly/{report}/{year}/{month}.
If a URL does not match any Route object
that is defined in the RouteTable collection, ASP.NET routing does not
process the request. Instead, processing is passed to an ASP.NET page,
Web service, or other ASP.NET endpoint.

译文:您可通过包含常量来避免模式被之歧义,例如
annual/{report}/{year} and monthly/{report}/{year}/{month}。

如URL不般配在RouteTable集合中定义之别路由对象,ASP.NET路由于未处理要。相反,处理让传送让一个ASP.NET
Page ,Web服务,或外ASP.NET端点。

2.12 路由二义性

无非在同一个解决方案被,存在个别独与上述同等控制器下之相同action,当URL请求时,会现出二义性。

二义性Demo目录结构

图片 10

RouteConfig.cs

图片 11图片 12

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 using System.Web.Routing;
 7 
 8 namespace MVCDemo
 9 {
10     public class RouteConfig
11     {
12         public static void RegisterRoutes(RouteCollection routes)
13         {
14             routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
15 
16             routes.MapRoute(
17                 name: "Default", 
18                 url: "{controller}/{action}/{id}", 
19                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
20                 
21            );
22         }
23     }
24 }
25                 

View
Code

/Controllers/RouteDemo

图片 13图片 14

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace MVCDemo.Controllers
 8 {
 9     public class RouteDemoController : Controller
10     {
11         //
12         // GET: /RouteDemo/
13         public ActionResult Index()
14         {
15             return View();
16         }
17     }
18 }

View
Code

/Controllers/NewFolder1/RouteDemo

图片 15图片 16

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace MVCDemo.Controllers.NewFolder1
 8 {
 9     public class RouteDemoController : Controller
10     {
11         //
12         // GET: /RouteDemo/
13         public ActionResult Index()
14         {
15             return Content("路由二义性测试");
16         }
17     }
18 }

View
Code

测试结果

图片 17

3 路由于概述(特性路由)

 特性路由于是当ASP.NET MVC
5中新增的,传统路由ASP.NET MVC 1中即使出矣。

 从内容达到来拘禁,特性路由的情及民俗路由差不多,同样来路由URL、路由于值、控制器路由、路由于约与路由默认值等。鉴于篇幅限制,在这边就概括的概述一下,不作详细阐释,后期起工夫还是有对象要,再论述。

 定义:特性路由于就是拿行程由于URL定义以控制器上要控制器内的方及,而未像风路由将行程由于URL定义以RouteConfig.cs中。对比如下

图片 18

 

图片 19

3 路由于生成URL

 
 路由少数只重要职责:匹配传入的URL请求和结构与一定路由对应的URL,概括的匹配配URL和布局URL。在生成URL时,生成URL的趣应该率先与择用来生成URL的里程由于相匹配,这样路由于就可以当拍卖传入或传播的URL时成完全的双向系统。原则及,开发人员应该提供相同组行程由于值,以便路由于系统从中选中第一只会匹配URL的路由。

 3.1 URL生成的高层系概述

 
路由的中坚是一个非常简单的算法,该算法基于一个由于RouteCollection类和RouteBase类组成的简约抽象对象。可以利用多方来生成URL,但这些办法还因调用RouteCollection.GetVirtualPath的一个重载方法而终结。RouteCollection.GetVirtulPath方法公有两个重载版本,下面的代码展示它的点子签名:

1  public  VirtualPathData GetVirtualPath(RequestContext requestContex,RouteValueDictionary values)
2 
3  public  VirtualPathData GetVirtualPath(RequestContext requestContex,string name,RouteValueDictionary values)

 第一个重载版本接受当前的RequestContext,以及由于用户指定的路由值(字典)。

(1)路由于汇通过RouteBase.GetVirtualPath方法遍历每个路由并走访:“可以生成给定参数的URL吗”,这个过程看似于当路由于同传播请求匹配时所运用的匹配逻辑。

(2)如果一个路由可对上面的问题(即匹配),那么其就是见面返回一个饱含了URL的VirTualPathData实例以及其它匹配的信息。否则,它就归空值,路由于体制变向列表中的下一个路由。

老二独重载接受三独参数,其中第二个参数是路由于名称。在路途由于汇中路由名称是绝无仅有的,也就是说,没有少单不同的路由具有同样之名目。当指定了路程由于名称时,路由于汇就不需循环遍历每个路由,相反,它可以立刻找到指定名称的路由,并移向上面的步骤(2)。如果找到的路由于非克配合指定的参数,该方式就是见面回到空值,并且不再匹配其他路由。

  3.2  URL生成详解

 
(1)开发人员调用像Html.ActionLink或Url.Action之类的法子,这些办法反过来又调用RouteCollection.GetVirtualPath方法,并为她传递一个RequestContext对象、一个蕴含值的字典以及用于选择生成URL的路由名称(可选参数)。

 (2)路由于体制查看要求的路由参数(即无供路由参数的默认值),并包提供的路程由于值字典为各级一个渴求的参数提供一个价值,否则,URL生成程序就算会见即时终止,并赶回空值。

 (3)一些里程由于可能含无针对性应路由参数的默认值。如路由于可能吗category键提供默认值“pastries”,但是cateory不是路由URL的一个参数,这种气象下,如果用户传入的路由于值字典为category提供了一个价值,那么该值必须匹配category的默认值。

 (4)然后路由于网运用路由约束。

(5)路由于相当成!现在可以经翻各个一个路由参数,并尝试采用字典中之对应值填充相应参数,进而生成URL。

得包为如下流程图:

图片 20

 

4 路由于绑定到操作

 在当时无异于段节,主要分析URL绑定到控制器操作的底色细节,分析底层原理,理解ASP.NET请求管道。注意,目前行程由于非仅仅只是ASP.NET
MVC的一个表征了,它早已越这个限制,如ASP.NET Dynamic
Data。路由既不包括MVC的其中知识,也非借助让MVC。

 4.1 高层次请求的路由管道

  当ASP.NET
处理要时,路由于管道主要是因为以下几步组成:

 
 (1)UrlRoutingModule尝试使用以RouteTable中登记的路由匹配当前恳请。

 
 (2)如果RouteTable中生出一个程由于成功匹配,路由于模块就见面从匹配成功之行程由于丁得到IRouteHandler接口对象。

 
 (3)路由于模块调用IRouteHandler接口的GetHandler方法,并赶回用来拍卖要的IHttpHandler对象。

 
 (4)调用HTTP处理程序中之ProcessRequest方法,然后把要拍卖的要传递给它们

   (5)在ASP.NET
MVC中,IRouteHandler是MvcRouteHandler类的一个实例,MvcRouteHandler转而返一个实现了IHttpHandler接口的MvcHandler对象。返回的MvcHandler对象主要用来实例化控制器,并调
       用该实例化的控制器上之操作方法。

4.2 路由数

   
调用GetRouteData方法会返回RouteData的一个实例。RouteData中含有了有关匹配请求的路由信息。

   
如URL:{Controller}/{action}/{id}。当请求/albums/list/123传唱时,该路由就会见尝试匹配传入的求,如果配合成功,它就是创办一个字典,其中涵盖了由URL中分析出的信息。确切地摆,路由于还会朝着Values字典中吗URL中的每个路由参数上加一个键;对于传统路由{Controller}/{action}/{id},Values字典中当至少含有三单键,分别是Controller,action和id,如果传入的URL是对/albums/list/123之伸手,路由于就见面分析该要的URL,并为字典的键提供值。本例中,字典中“Controller”键的值为albums,”action”键的价也“list”,”id”键的价值是“123”;对于特性路由MVC使用DataTokens字典来囤更规范的音信,而休是操作名称字符串。具体来说,它含有一个操作描述符列表,这些描述称直接指向路由相当配时可能用的操作方法。对于控制器级别的特色路由,列表中拿产生持续一个操作。在合MVC中都发生采取的RequestContext的RouteData属性保存在外面路由于值。

5 路由于调试

 
 使用RouteDebugger调试,启用RouteDebugger后,它会用一个DebuggerRouteHandler替换所有路由处理程序,DebugRouteHandler截获所有传入的恳求,并查询路由表中的每一个路由,以便在页面底部显示路由的确诊数据与参数。为使用RouteDebugger,只待于VS的Package
Manager Console窗口被使用NuGet安装即可,命令Install-Package
routedebugger.。RouteDebugger包在添加Route
Debugger程序集的又。也当web.config文件之appSettings节点中上加一个装,用来开或禁用路由调试。

<add key="RouteDebugger:Enable" value="true'>

 只要启用RouteDebugger,它就是显示从(在地方栏中)当前呼吁URL中提取的路由数据。如此,可以当地点栏中输入各种URL,并查看输入的URL能同谁路由于相当,在页面底部,它还见面显一个涵盖应用程序定义的所用路由于列表,这样可查定义的谁路由能够跟当下URL相配合。

安装教程如下:

视图=>其他窗口=>程序包管理控制台

图片 21

以窗口被输入:Install-Package
routedebugger

图片 22

抑或为得采用NuGet很方便的设置RouteDebugger,在路方右键-“Manage
NuGet Packages”-“Online”输入”RouteDebugger”然后”Install”.

自, 你吧得好生载RouteDebugger.dll,
引用到web项目面临, 然后手动在web.config中在

<add key="RouteDebugger:Enabled" value="true" />

测试结果

RouteConfig.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 using System.Web.Routing;
 7 
 8 namespace MVCDemo
 9 {
10     public class RouteConfig
11     {
12         public static void RegisterRoutes(RouteCollection routes)
13         {
14             routes.MapMvcAttributeRoutes();//
15 
16             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
17 
18             routes.MapRoute(
19                 name: "Default",
20                 url: "{controller}/{action}/{id}",
21                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
22             );
23         }
24     }
25 }

RouteDemoController

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace MVCDemo.Controllers
 8 {
 9     public class RouteDemoController : Controller
10     {
11         //
12         // GET: /RouteDemo/
13         public ActionResult Index()
14         {
15             return View();
16         }
17     }
18 }

Index

1 @inherits System.Web.Mvc.WebViewPage
2 
3 <h2>RouteDebugger调试</h2>

 

图片 23

6 同程由于相关的要命名空间以及类

 6.1  路由涉及的命名空间

图片 24

 6.2 Class
Reference( 路由涉及到之严重性类)

图片 25

 

7 总结

 由于篇幅有限,路由于章节就形容及当时,当然,还有不少情节尚未写,如路由于安排文件、路由于安设置、自定义路由约等,留给读者朋友等去研究吧。

8 参考文献

 【01】https://msdn.microsoft.com/en-us/library/cc668201.aspx\#setting\_default\_values\_for\_url\_parameters

【02】http://www.cnblogs.com/willick/p/3343105.html

【03】https://msdn.microsoft.com/zh-cn/library/cc668201(v=vs.100).aspx

【04】Professional Asp.net MVC 5

【05】http://www.cnblogs.com/liangxiaofeng/p/5620033.html

【06】https://msdn.microsoft.com/en-us/library/cc668177.aspx

【07】https://msdn.microsoft.com/en-us/library/dd535620.aspx

【08】https://msdn.microsoft.com/en-us/library/cc668176.aspx

【09】https://msdn.microsoft.com/en-us/library/dd329551.aspx

【10】https://msdn.microsoft.com/en-us/library/system.web.routing.route.aspx

【11】https://msdn.microsoft.com/en-us/library/system.web.routing.pageroutehandler.aspx

【12】https://msdn.microsoft.com/en-us/library/system.web.mvc.mvcroutehandler.aspx

【13】https://msdn.microsoft.com/en-us/library/system.web.ui.page.routedata.aspx

【14】https://msdn.microsoft.com/en-us/library/bb398900.aspx

【15】https://msdn.microsoft.com/en-us/library/ee941656.aspx

 

9   版权

 

  • 谢谢你的看,若有不足之处,欢迎指教,共同学习、共同进步。
  • 博主网址:http://www.cnblogs.com/wangjiming/。
  • 最少一些文章以读、参考、引用、抄袭、复制与糊等多种方组成而成为的,大部分呢原创。
  • 假如您喜爱,麻烦推荐一下;如你来新想法,欢迎提出,邮箱:2016177728@qq.com。
  • 可以转载该博客,但必须著名博客来源。

相关文章