§8 URLs and Routing

Before ASP.NET MVC, the core assumption of routing in ASP.NET (just like
in many other web application platforms) was that URLs correspond
directly to files on the server’s hard disk. The server executes and
serves the page or file corresponding to the incoming URL. Table 8–1
gives an example

葡萄娱乐场 1

这么, 限制会繁多, 有的人不想让旁人明白自身文件的路线,



§8.1 Putting the Programmer Back in Control

ASP.NET MVC打破了这种规模, since ASP.NET MVC’s requests are handled by
controller classes (compiled into a .NET assembly), there are no
particular files corresponding to incoming

You are given complete control of your ULacrosseL schema—that is, the set of
U索罗德Ls that are accepted and their mappings to controllers and actions.

葡萄娱乐场 2

This is all managed by the framework’s routing


§8.1.1 About Routing and Its .NET Assemblies

The routing system was originally designed for ASP.NET MVC, but it was
always intended to be shared with other ASP.NET technologies,
including Web Forms.路线系统本来是给mvc自身用的,
所以路线代码是坐落三个单独的顺序集里(System.Web.Routing.dll in .NET
三.5, and simply System.Web.dll in .NET 4),而不是在System.Web.Mvc.dll


 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;
 8 namespace MVCDemo
 9 {
10     public class RouteConfig
11     {
12         public static void RegisterRoutes(RouteCollection routes)
13         {
14             routes.MapMvcAttributeRoutes();//特性路由
16             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");//忽略资源文件
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*$" }//约束
25                 );
26         }
27     }
28 }

§8.2 Setting Up Routes

大家来探视路线的计划, 在global.asax.cs文件里

    public class MvcApplication : System.Web.HttpApplication
        public static void RegisterRoutes(RouteCollection routes)
                "Default", // 路由名称
                "{controller}/{action}/{id}", // 带有参数的 URL
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值

        protected void Application_Start()

When the application first starts up (i.e., when Application_Start()
runs), the RegisterRoutes() method populates a global static
RouteCollection object called RouteTable.Routes. That’s where the
application’s routing configuration lives. The most important code is
that shown in bold: MapRoute() adds an entry to the routing
configuration. To understand what it does a little more clearly, you
should know that this call to MapRoute() is just a concise alternative
to writing the following:当应用程序运营的时候,也正是Application_Start()
鱼腥的时候, RegisterRoutes()
也是放置路线配置的地点.MapRoute是路径配置的入口, 为了轻巧的印证,

            Route myRoute = new Route("{controller}/{action}/{id}", new MvcRouteHandler())
                Defaults = new RouteValueDictionary(new
                    controller = "Home",
                    action = "Index",
                    id = UrlParameter.Optional
            routes.Add("Default", myRoute);


葡萄娱乐场 3


§8.2.1  Understanding the Routing Mechanism

The routing mechanism runs early in the framework’s request processing
pipeline. Its job is to take an incoming UCR-VL and use it to obtain an
IHttpHandler object that will handle the request.
早起的路由机制运作在框架的呼吁处理管道. 它的工作就是使用进来的UMuranoL,
并用它来得到贰个可见处理请求的的IHttpHandler 对象

Many newcomers to the MVC Framework struggle with routing. It isn’t
comparable to anything in earlier ASP.NET technologies, and it’s easy
to configure wrong. By understanding its inner workings, you’ll avoid
these difficulties, and you’ll also be able to extend the mechanism
powerfully to add extra behaviors across your whole

The Main Characters: RouteBase, Route, and RouteCollection


  • RouteBase is the abstract base class for a routing entry.
    You can implement unusual routing behaviors by deriving a custom
    type from it (I’ve included an example near the end of this
    chapter), but for now you can forget about it.
  • Route is the standard, commonly used subclass of RouteBase
    that brings in the notions of URL templating, defaults, and
    constraints. This is what you’ll see in most examples.
  • A RouteCollection is a complete routing configuration. It’s
    an ordered list of RouteBase-derived objects (e.g., Route

How Routing Fits into the Request Processing Pipeline

When a UPRADOL is requested, the system invokes each of the IHttpModules
registered for the application. 当3个UTiggoL被呼吁,


The Order of Your Route Entries Is Important

If there’s one golden rule of routing, this is it: put
more-specific route entries before less-specific
若是有个路由安顿的金子规则: 那么正是将卓殊路线放在一般路径的前边.
因为系统的方便由的算法是从最上方开始, 而不是找最契合的.


§8.2.2  Adding a Route Entry

暗许的路由是很普通的, 倘诺你想要处理任何类其他U瑞虎L, 你还亟需做1些手脚.
作者来举个大致的事例, 比如大家想要用URAV四L /Catalog来查看这一个种类的享有产品

            routes.Add(new Route("Catalog", new MvcRouteHandler())
                Defaults = new RouteValueDictionary(
                new { controller = "Products", action = "List" }

我们能够用地点的那段代码来贯彻大家的目的. 它能够帮助大家兑现/Catalog
也许是 /Catalog?some=querystring, 可是 /Catalog/Anythingelse


URL Patterns Match the Path Portion of a URL

葡萄娱乐场 4


Meet RouteValueDictionary

A different technique to populate a RouteValueDictionary is to
supply an IDictionary<string, object> as a constructor
parameter, or alternatively to use a collection initializer, as in the
following example:

            routes.Add(new Route("Catalog", new MvcRouteHandler())
                Defaults = new RouteValueDictionary
                    { "controller", "Products" },
                    { "action", "List" }


Take a Shortcut with MapRoute()

ASP.NET MVC adds an extension method to RouteCollection, called
MapRoute(). 你会意识那比使用routes.Add(new Route(…)) 方便好些个.

            routes.MapRoute("PublicProductsList", "Catalog",
                new { controller = "Products", action = "List" });

In this case, PublicProductsList is the name of the route entry.
It’s just an arbitrary unique string. That’s optional.


§8.2.3  Using Parameters

As you’ve seen several times already, parameters can be accepted via a
curly brace syntax. 正像你前边看到的, 参数能够放在{}里,

            routes.MapRoute(null, "category/{color}",
               new { controller = "Products", action = "List" });

This route will now match URLs such as /Catalog/yellow or
/Catalog/1234, and the routing system will add a corresponding
name/value pair to the request’s RouteData object. On a request
to /Catalog/yellow, for example, RouteData.Values[“color”] would be
given the value yellow


Receiving Parameter Values in Action Methods

You know that action methods can take parameters. When ASP.NET MVC
wants to call one of your action methods, it needs to supply a value
for each method parameter. One of the places where it can get values
is the RouteData collection. It will look in RouteData’s Values
dictionary, aiming to find a key/value pair whose name matches the
parameter name.

咱俩知晓action方法能够带参数. 当mvc想要调用一个action方法,
它必要提供2个value给艺术的参数. 它拿走value的叁个地点正是RouteData
So, if you have an action method like the following, its color
parameter would be populated according to the {color} segment parsed
from the incoming URL:

故此, 假诺你有个action方法像上面那样的,

        public ActionResult List(string color)
            // Do something

To be more precise, action method parameters aren’t simply taken
directly from RouteData.Values, but instead are fetched via the
model binding system, which is capable of instantiating and
supplying objects of any .NET type, including arrays and collections.
You’ll learn more about this mechanism in Chapters 九 and 12.
而是从模型绑定系统中取得,各个.net类型. 你会在第10章和1二章中领悟越多.


§8.2.4  Using Defaults

You didn’t give a default value for {color}, so it became a mandatory
parameter. The Route entry no longer matches a request for /Catalog.
You can make the parameter optional by adding to your Defaults object:
在上头的例子中, 大家未有给{color}二个暗中认可值, 它成为了1个威胁的参数.
路由入口不再相称/Catalog 请求. 你能够

            routes.MapRoute(null, "Catalog/{color}",
                new { controller = "Products", action = "List", color = (string)null });

那样, 路由就能相配/Category和/Category/orange了.

倘使您想要一个非null 的默许值, 比如未有null的 int, 你能够显式的钦赐值

            routes.Add(new Route("Catalog/{color}", new MvcRouteHandler())
                Defaults = new RouteValueDictionary(
                new { controller = "Products", action = "List", color = "Beige", page = 1 }

That’s a perfectly fine thing to do; it’s the correct way to set up
RouteData values that are actually fixed for a given Route
entry. For example, for this Route object,
RouteData[“controller”] will always equal “Products”, regardless
of the incoming URL, so matching requests will always be handled by

那样,不管道输送入的url是怎么, 相配请求总会被ProductsController处理.

Remember that when you use MvcRouteHandler (as you do by default
in ASP.NET MVC), you must have a value called controller; otherwise,
the framework won’t know what to do with the incoming request and will
throw an error. The controller value can come from a curly brace
parameter in the URL, or can just be specified in the Defaults object,
but it cannot be omitted.


Creating Optional Parameters with No Default Value

就像私下认可的路由配置, 大家能够钦赐私下认可值UrlParameter.Optional.

            routes.MapRoute(null, "Catalog/{page}",
                new { controller = "Products", action = "List", page = UrlParameter.Optional });

如此, 当访问的UGL450L有page值的时候, 咱们就接纳传入的vallue, 假诺没有,
为何不用0可能是null 作为私下认可参数, 上边是它的三个原因:

  • If your action method takes a page parameter of type int, then
    because that type can’t hold null, you would have to supply the
    default value of 0 or some other int value. This means the action
    method would now always receive a legal value for page, so you
    wouldn’t be able to control the default value using the MVC
    Framework’s [DefaultValue] attribute or C# 4’s optional
    parameter syntax on the action method itself (you’ll learn more
    about these in the next chapter).
  • 若是你的action方法有个int类型的page参数,可是它是值类型,
    无法是null. 所以你需求提供三个暗中同意值(0也许是任何的值).
    那也感到着action方法总是须要二个合法的值, 所以,
  • Even if your action’s page parameter was nullable, there’s a
    further limitation. When binding incoming data to action method
    parameters, the MVC Framework prioritizes routing parameter values
    above query string values (you’ll learn more about value providers
    and model binding in Chapter 12). So, any routing value for
    page—even if it’s null—would take priority and hide any query
    string value called page.
  • 即时您的action的page参数能够是null类型. 这里还有个限制.
    当action方法的参数是binding类型的时候, mvc



§8.2.5  Using Constraints

神跡, 你会想要加多额外的标准化, 以合营特定的route. 比如:

  • 您想相称get请求, 而不是post请求
  • 壹些参数要同盟特定的参数(e.g. ID参数必须同盟数字类型)
  • 局地route用来相称常规的web浏览器发来的请求,

In these cases, you’ll use the Route’s Constraints property


Matching Against Regular Expressions

为了确认保障参数是数字类型的, 大家使用那样的规则:

            routes.MapRoute(null, "Articles/{id}",
                new { controller = "Articles", action = "Show" },
                new { id = @"\d{1,6}" });

如此那般, route就会相配 /Articles/1 和 /Articles/12345陆 那两种类型,
而不是任何的,(这里的正则表达式表示的是: 数字类型,一~6个)


Matching HTTP Methods

If you want your Route to match only GET requests (not POST
requests), you can use the built-in HttpMethodConstraint class (it
implements IRouteConstraint)—for example:

            routes.MapRoute(null, "Articles/{id}", 
                new { controller = "Articles", action = "Show" },
                new { httpMethod = new HttpMethodConstraint("GET") });

您想相配什么样的HTTP方法, 就把它放到HttpMethodConstraint构造器中,
比如,new HttpMethodConstraint(“GET”, “DELETE”).

您要小心的是 HttpMethodConstraint[HttpGet] and


Matching Custom Constraints

只要前边的三种都不能够满意你, 那么你仍是能够兑现它的.

        public class UserAgentConstraint : IRouteConstraint
            private string _requiredSubstring;
            public UserAgentConstraint(string requiredSubstring)
                this._requiredSubstring = requiredSubstring;
            public bool Match(HttpContextBase httpContext, Route route, string paramName,
            RouteValueDictionary values, RouteDirection routeDirection)
                if (httpContext.Request.UserAgent == null)
                    return false;
                return httpContext.Request.UserAgent.Contains(_requiredSubstring);


            routes.Add(new Route("Articles/{id}", new MvcRouteHandler()){
                Defaults = new RouteValueDictionary(new { controller = "Articles", action = "Show" }),
                Constraints = new RouteValueDictionary(
                    new { id = @"\d{1,6}", userAgent = new UserAgentConstraint("iPhone") }});


§8.2.6  Prioritizing Controllers by

§8.2.7  Accepting a Variable-Length
List of Parameters

§8.2.8  Matching Files on the Server’s
Hard Disk

§8.2.9  Using IgnoreRoute to Bypass the Routing System

public static void RegisterRoutes(RouteCollection routes)
    // Rest of routing config goes here

Here, {filename}.xyz is treated as a URL pattern just like in a normal
route entry, so in this example,
the routing system will now ignore any requests for /blah.xyz or
/foo.xyz?some=querystring. (Of course,
you must place this entry higher in the route table than any other
entry that would match and handle
those URLs.) You can also pass a constraints parameter if you want
tighter control over exactly which
URLs are ignored by routing.

那边{filename}.xyz 被看成多少个U大切诺基L模型, 就如1个平淡无奇的路由入口. 



 1.1 URI、URL和URN定义 

     UOdysseyI(Uniform Resource

     U途胜L (Uniform Resource

     U瑞鹰N(Uniform Resources

 一.二 U索罗德I、UEscortL和U奇骏N叁者之间的涉及图

葡萄娱乐场 5

一.三 对URAV4I、U猎豹CS6L和UQX56N3者之间解析




一.肆 UCR-VL应有所特色

     (一)  域名便于回忆和拼写;

     (2)  简短;

     (三)  便于输入;

     (四)  能够呈现出站点布局;


     (陆)  持久、不能够更换

1.5  小结

 常常情形下,U途乐I代表同意财富标志符(Uniform Resource


二 路由概述(传统路由)

2.1  WebForm URL与Route URL


 葡萄娱乐场 6


2.2  ASP.NET 路由与 URL 重写

        ASP.NET 路由分裂于其余 U哈弗L
重写方案。URubiconL 重写通过在将请求发送到网页以前实际更动 UCR-VL
来处理传入请求。例如,3个运用 URubiconL 重写的应用程序大概会将 U福特ExplorerL 从 /Products/Widgets/ 更换为 /Products.aspx?id=4。别的,U凯雷德L 重写平时未有对应的 API
来创立基于格局的 U大切诺基L。在 UMuranoL 重写中,倘使更换了 ULANDL
情势,则必须手动更新包罗原始 UKoleosL 的具有超链接。由于
ASP.NET 路由得以从 U纳瓦拉L 提取值,所以拍卖传入请求时不更动UWranglerL。借使必须创立多少个 UCR-VL,则将参数值传递到为您生成 UBMWX三L
的法子中。若要改换 UOdysseyL

2.3  路由定义

        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.


      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.


2.4 URL Patterns(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.


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.


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.


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


葡萄娱乐场 7

 Typical URL Patterns in MVC


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


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


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.

译文:例如,二个分包UPAJEROL路线  /产品
的U普拉多L映射到二个名称叫ProductsController的调节器。action参数中的值是调用的操作方法的名称。贰个暗含U奥迪Q5L路径  /产品/show

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


 葡萄娱乐场 8

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:


 葡萄娱乐场 9


葡萄娱乐场 10

贰.伍 Adding Routes to a Web Forms

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


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.


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.


protected void Application_Start(object sender, EventArgs e)

public static void RegisterRoutes(RouteCollection routes)

2.6 Adding Routes to an MVC

 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.


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)

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.


public class MvcApplication : System.Web.HttpApplication
    public static void RegisterRoutes(RouteCollection routes)

            "Default",                                              // Route name 
            "{controller}/{action}/{id}",                           // URL with parameters 
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults


    protected void Application_Start()

二.七 Setting Default Values for U宝马7系L

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.


void Application_Start(object sender, EventArgs e) 

public static void RegisterRoutes(RouteCollection routes)
        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.

葡萄娱乐场 11

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

二.8 Handling a Variable Number of Segments
in a U奥迪Q3L Pattern(在U奥迪Q5L方式中拍卖可变多少的段)

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.


/ 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.


葡萄娱乐场 12

2.玖  Adding Constraints to

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

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.

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.

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.

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.)



 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.

葡萄娱乐场 13

 2.10 Scenarios When Routing Is Not

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.


A Physical File is Found that Matches
the U凯雷德L Pattern(找到与U奥迪Q5L形式相称的物理文件)

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
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.


Routing Is Explicitly Disabled for a
UPAJEROL Pattern(为UTiggoL格局显式禁用路由)

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  

页面来拍卖的,网络页面,Web服务,或别的ASP.NET端点。您能够应用 RouteCollection.Ignore方法。

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

二.1一 How UMuranoLs Are Matched to

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:


  • 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

   Route 2 is set to

译文:路线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
controller is products.
action is show.
id is 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






You can avoid ambiguity in the patterns
by including constants, such as annual/{report}/{year} and
葡萄娱乐场,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}。

Page ,Web服务,或别的ASP.NET端点。

二.1二 路由贰义性



葡萄娱乐场 14


葡萄娱乐场 15葡萄娱乐场 16

 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;
 8 namespace MVCDemo
 9 {
10     public class RouteConfig
11     {
12         public static void RegisterRoutes(RouteCollection routes)
13         {
14             routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
16             routes.MapRoute(
17                 name: "Default", 
18                 url: "{controller}/{action}/{id}", 
19                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
21            );
22         }
23     }
24 }



葡萄娱乐场 17葡萄娱乐场 18

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 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 }



葡萄娱乐场 19葡萄娱乐场 20

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 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 }



葡萄娱乐场 21

叁 路由概述(个性路由)

 性情路由是在ASP.NET MVC
5中新扩充的,守旧路由ASP.NET MVC 第11中学就有了。



葡萄娱乐场 22


葡萄娱乐场 23

3 路由生成U奥迪Q7L


 叁.壹 U本田CR-VL生成的高层系概述


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





  三.二  UEnclaveL生成详解







葡萄娱乐场 24


肆 路由绑定到操作

MVC的三个本性了,它已经超(Jing Chao)过那一个限制,如ASP.NET Dynamic

 四.一 高层次请求的路由管道







四.二 路由数量



伍 路由调试

Manager Console窗口中选拔NuGet安装就可以,命令Install-Package

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




葡萄娱乐场 25


葡萄娱乐场 26

NuGet Packages”-“Online”输入”RouteDebugger”然后”Install”.

理所当然, 你也得以本人下载RouteDebugger.dll,
引用到web项目中, 然后手动在web.config中加入

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



 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;
 8 namespace MVCDemo
 9 {
10     public class RouteConfig
11     {
12         public static void RegisterRoutes(RouteCollection routes)
13         {
14             routes.MapMvcAttributeRoutes();//
16             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
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 }


 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 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 }


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


葡萄娱乐场 27

陆 与路由相关的根本命名空间和类

 陆.一  路由涉及的命名空间

葡萄娱乐场 28

 陆.贰 Class
Reference( 路由涉及到的重中之重类)

葡萄娱乐场 29


7 总结


8 参考文献




【04】Professional Asp.net MVC 5













9   版权


  • 多谢您的读书,若有不足之处,欢迎指教,共同学习、共同进步。
  • 博主网站:http://www.cnblogs.com/wangjiming/。
  • 极少1些文章利用读书、参考、引用、抄袭、复制和粘贴等各类方法结合而成的,超越二伍%为原创。
  • 如你喜欢,麻烦推荐一下;如你有新想法,欢迎提议,邮箱:二〇一五17772八@qq.com。
  • 能够转发该博客,但必须盛名博客来源。