【ASP.NET MVC系列】浅谈ASP.NET MVC 路由。【Pro ASP.NET MVC 3 Framework】.学习笔记.12.ASP.NET MVC3的细节:URLs,Routing和Areas

by admin on 2018年10月5日

事例引入

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。
  • 可以转载该博客,但不能不著名博客来源。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图