【ASP.NET MVC连串】浅谈ASP.NET MVC 路由葡萄娱乐官方

事例引入

§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
UTiggoLs.所以这也就没有途径对应的一定文件了.

You are given complete control of your U凯雷德L schema—that is, the set of
UXC90Ls that are accepted and their mappings to controllers and actions.
上面我们来探望mvc中是什么定义路径的.

葡萄娱乐官方 2

This is all managed by the framework’s routing
system.这完全是又框架的途径系统管理的.

 

§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本人用的,
可是也会被其他asp.net技术使用.
所以路径代码是放在3个单身的先后集里(System.Web.Routing.dll in .NET
3.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;
 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 }

§8.2 Setting Up Routes

我们来看望路径的配置, 在global.asax.cs文件里

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

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

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()
静态方法会装入3个称为RouteTable.Routes的大局静态RouteCollection对象.
也是停放路径配置的地点.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 UKoleosL and use it to obtain an
IHttpHandler object that will handle the request.
早起的路由机制运转在框架的请求处理管道. 它的做事就是选拔进来的U本田UR-VL,
并用它来取得三个可见处理请求的的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
application.许多mvc框架的新手对路由的概念改到很狐疑.
因为它和以后其它的asp.net技术区别,而且很简单配置错误.
通过领会它的内部运行,我们就足以防止这几个难题,你也足以通过扩展额外的表现使全体应用程序拓展的更强大.

The Main Characters: RouteBase, Route, and RouteCollection

路由配置首要有2个部分:

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

How Routing Fits into the Request Processing Pipeline

When a U奥德赛L is requested, the system invokes each of the IHttpModules
registered for the application. 当3个UGL450L被呼吁,
系统调用各个在应用程序中一度登记的IHttpModules
.当中2个就是UrlRoutingModule

** 

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
ones.
倘诺有个路由安插的纯金规则: 那么就是将相当路径放在一般路径的前边.
因为系统的非凡由的算法是从最顶端初始, 而不是找最符合的.

 

§8.2.2  Adding a Route Entry

私下认可的路由是很一般的, 假诺你想要处理其余品类的ULX570L, 你还须求做一些手脚.
小编来举个简易的例子, 比如大家想要用U福特ExplorerL /Catalog来查看这几个类别的兼具成品

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

咱俩得以用地点的这段代码来兑现大家的目标. 它能够协理大家兑现/Catalog
恐怕是 /Catalog?some=querystring, 不过 /Catalog/Anythingelse
那样的url是不行的.

 

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. 正像你面前看到的, 参数能够放在{}里,
那里大家加贰个color参数到路由中:

            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方法,
它需求提供一个value给艺术的参数. 它赢得value的三个地点便是RouteData
collection.
它会在RouteData’s
的键值对中找找贰个和参数名对应的value.
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方法像下边这样的,
那么它的color参数就在流传的url中的{color}中

        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 9 and 12.
更准确的说,
action方法的参数不仅仅只是简单的第①手从RouteData.Values获取.
而是从模型绑定系统中获得,种种.net类型. 你会在第8章和12章中打听更加多.

 

§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}一个暗中同意值, 它成为了四个强制的参数.
路由入口不再匹配/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
ProductsController.

诸如此类,不管道输送入的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 });

那样, 当访问的UXC60L有page值的时候, 我们就应用传入的vallue, 假设没有,
那么大家就不想action方法中传任何参数.你恐怕会纳闷,
为何不用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方法总是必要三个法定的值, 所以,
    假设action方法本中国人民银行使mvc框架的[defaultvalue]特色或许是C#4的可选参数语法,
    你将不大概控制它的类型.(你会在接下去的一章中驾驭越来越多)
  • 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
    框架会将路由参数优先于查询字符串值.(你会在12章中学到值提供者和模型绑定).
    所以,
    任何为page设置的路由值–固然是null–也会先行于访问page的查询字符串

UrlParameter.Optional焚林而猎了那三个难题

 

§8.2.5  Using Constraints

偶尔, 你会想要添加额外的标准化, 以协作特定的route. 比如:

  • 你想匹配get请求, 而不是post请求
  • 有的参数要协作特定的参数(e.g. ID参数必须合营数字类型)
  • 一对route用来匹配常规的web浏览器发来的请求,
    有的匹配iphone发来的等同UXC60L

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/123456 这两连串型,
而不是任何的,(那里的正则表达式表示的是: 数字类型,1~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
[HttpPost]
无关

 

Matching Custom Constraints

假定前方的两种都不能满意你, 那么您要么得以兑现它的.
举个例子,假使你想建立2个只同意web浏览器进入的路由入口,
你能够创造如下的约束:

        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);
            }
        }

下边包车型客车路由只好同盟由iphone发起的伸手:

            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
Namespace

§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)
{
    routes.IgnoreRoute("{filename}.xyz");
    // 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 URI、URL与URN

 1.1 URI、URL和URN定义 

     U中华VI(Uniform Resource
Identifier)代表统一能源标识符,标识能源的字符串;

     U奥迪Q5L (Uniform Resource
Locator)代表联合能源定位符,网络上标准能源的地址;

     UCR-VN(Uniform Resources
Name)代表联独能源名称,互连网上财富的名目;

 1.2 UHavalI、U锐界L和U揽胜极光N三者之间的涉及图

葡萄娱乐官方 5

1.3 对UPRADOI、URAV4L和U卡宴N三者之间解析

      本解析基于1.2
UCRUISERI、U科雷傲L和U帕杰罗N三者之间的关联图。

     
(1)从命名角度,UXC90I标识能源且唯一,U汉兰达L标识财富地址
,USportageN标识财富名称;

     
(2)从数学关系:U奥迪Q3I=U瑞鹰L+U帕杰罗N+U奔驰M级L∩U本田CR-VN;很简单见到,U瑞鹰L一定是U库罗德I,但U昂CoraI不自然是U福睿斯L,同理,U奥迪Q3N一定是U昂科拉I,但U福睿斯I不自然是UTucsonN;

1.4 UTiguanL应有所特色

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

     (2)  简短;

     (3)  便于输入;

     (4)  能够反映出站点布局;

     (5)
 应该是“可破解的”,用户能够经过移除UENCOREL的结尾,进而到达更高层次的音信种类布局;

     (6)  持久、不可能更改

1.5  小结

     
 平日状态下,U本田UR-VI代表同意能源标识符(Uniform Resource
Identifier)。UCRUISERI是标识了1个财富的字符串。从技术角度看,全部U劲客L都以ULacrosseI。W3C认为“U福睿斯L是一个业余的定义,但它不行实惠:USportageL是U兰德中华VI的一种档次,它经过代表笔者的重点走访机制来标识资源”,换句话说,ULANDI是某种财富的标识符,而U奥迪Q3L则为获得该能源提供了具体的音信。

     
 注释:能源是三个抽象概念,既能够指3个文本,也足以指方法调用的结果或服务器上的某些其余剧情。

2 路由概述(守旧路由)

2.1  WebForm URL与Route URL

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

   
 葡萄娱乐官方 6

     (2)ASP.NET
MVC中,经常地,UTiggoL映射并非映射到实际磁盘上的情理文件,那是依据ASP.NET路由性情,首要有七个经过,即U中华VL映射和U福特ExplorerL生成(接下去讲解)。在ASP.NET路由中,您能够定义UENCOREL格局,该形式涵盖在拍卖U奥德赛L请求时使用的值的占位符。在运维时,运用程序名称前面的U锐界L部分遵照你所定义的UEscortL模式分析为离散值。例如,在伸手http://server/application/Products/show/beverages时,路由分析器可以将值Products、show和beverages传递给请求的处理程序。相反,在一个不由URL路由管理的请求中,/Products/show/beverages片段将被解释为运用程序中的一个文件的路径。
  

2.2  ASP.NET 路由与 URL 重写

        ASP.NET 路由分裂于其余 U索罗德L
重写方案。UTiggoL 重写通过在将呼吁发送到网页以前实际更改 UENVISIONL
来拍卖传入请求。例如,贰个使用 UOdysseyL 重写的应用程序大概会将 U福特ExplorerL 从 /Products/Widgets/ 更改为 /Products.aspx?id=4。别的,U本田CR-VL 重写平日没有相应的 API
来创设基于方式的 U冠道L。在 ULX570L 重写中,假若改动了 U瑞鹰L
方式,则必须手动更新包罗原始 U凯雷德L 的有着超链接。由于
ASP.NET 路由得以从 U宝马X5L 提取值,所以拍卖传入请求时不更改
ULX570L。假如非得创立1个 U奥迪Q7L,则将参数值传递到为你生成 UEscortL
的法门中。若要更改 U奥迪Q5L
格局,请在某地方变动该情势,您在应用程序中开创的根据该形式的具有链接将电动使用新形式。

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.

     
 译文:路由是一种被映射到有个别处理程序的U凯雷德L格局。处理程序大概是一个大体文件,如在WebForms运用程序中的aspx文件。处理程序也可能是1个处理请求的类,如MVC应用程序中的控制器。要定义路由,您能够透过点名U卡宴L格局、处理程序和路径的名目来创设路由类的实例。

      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.

     
译文:你能够透过将路由对象添加到RouteTable类的静态路由属性中的形式将路由添加到应用程序中。路由属性是3个为应用程序存储全数路由的路由对象。在MVC应用程序中,您平日不要求编写制定代码来添加路由。VS项目模板为MVC包括了优先安排的U昂CoraL路由。那一个都以在MvcApplication类中定义的,被定义在Global.asac
文件中。

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.

译文:U帕杰罗L方式大概含有文字值和变量占位符(称为U本田CR-VL参数)。文字和占位符位于U凯雷德L的一些中,由斜杠(/)字符分隔。

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.

译文:当发出请求时,UTucsonL被分析为一些和占位符,且变量值被提须求请求处理程序。那几个进程看似于查询字符串中的数据被分析并传递给请求处理程序的方式。在那三种状态下,变量音讯都含有在U帕杰罗L中,并以键值对的款型传递给处理程序。对于查询字符串,键和值都在UCRUISERL中。对于路由,键是U瑞鹰L形式中定义的占位符名称,在U君越L中唯有是值。

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.

译文:在U凯雷德L方式中,通过将它们封装在括号(以及)中来定义占位符。您能够在一个段中定义七个占位符,然则必须用文字值分隔它们。例如,语言-国家/行动是一种有效的路径格局。但是,语言国家/action不是2个有效的格局,因为占位符之间从未文字值或分隔符。因此,路由不能够决定将语言占位符的值与国家占位符的值分隔开分离。

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

下表展现了实惠的路由方式和与情势匹配的U哈弗L请求示例。

葡萄娱乐官方 7

 Typical URL Patterns in MVC
Applications

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

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

译文:在MVC运用程序中,路由U本田UR-VL情势经常包括控制器和动作占位符。

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处理程序通过向U景逸SUVL中的控制器值添加后缀“控制器”来鲜明要调用哪个控制器,以鲜明控制器的花色名称,该控制器将拍卖请求。U福睿斯L中的操作值决定调用哪个操作方法。

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.

译文:例如,二个分包U奥迪Q7L路径  /产品
的UENCOREL映射到一个名为ProductsController的控制器。action参数中的值是调用的操作方法的名目。二个涵盖U卡宴L路径
  /产品/show
 的U奥迪Q5L会造成对ProductsController类的Showmethod的调用。

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

译文:下表呈现了默许的ULANDL形式,它显得了由暗许路由拍卖的U瑞虎L请求的言传身教。

 葡萄娱乐官方 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:

译文:带有形式资源的路由axd/pathInfo,被用于幸免Web能源文件的伸手,例如WebResource,axd或ScriptResource传递到控制器。对于IIS
7.0,不要求任何文件名称增添。对于IIS
6.0,您必须添加.mvc文件扩大名到U昂科雷L形式中,如上面包车型地铁例子:

 葡萄娱乐官方 9

 如在VS二零一一利用MVC模板创造项目时,自动生成类RouteConfig.

葡萄娱乐官方 10

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文件的代码,该代码添加了3个路由对象,该目的定义了七个名为action和类型称号的U揽胜极光L参数。具有钦命情势的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 URAV4L
Parameters(为U途锐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.

译文:当您定义3个路由时,您能够为二个参数钦赐贰个暗中同意值。若是该参数的值没有包括在U兰德大切诺基L中,则运用暗许值。通过将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.

葡萄娱乐官方 11

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 U瑞虎L Pattern(在U本田UR-VL方式中处理可变多少的段)

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.

译文:有时你必须处理包罗三个可变多少的U牧马人L段的UCR-VL请求,当中。当你定义三个路由时,您能够钦定,即使1个U本田CR-VL的局地比方式中有越来越多的段,那么额外的段被认为是终极一有个别的一有些。要以那种办法处理额外的段,您能够用星号(*)标记最终三个参数。那被称呼1个不明的参数。一个分包全部参数的路由也将匹配不分包最后多个参数的任何值的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路由拍卖四个U昂科拉L请求时,示例中所示的路由定义产生了下表中列出的结果。

葡萄娱乐官方 12

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.

译文:除了通过U冠道L中参数的数码来匹配U科雷傲L请求外,还足以钦点参数中的值满意特定的约束规范。就算三个U库罗德L蕴含的值超出了路由的羁绊,那么该路由就不会被用于拍卖请求。您添加了有个别封锁,以保障U奥迪Q3L参数包罗在你的应用程序中央银行事的值。
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接口的对象来定义的。当将路由定义添加到路由集合时,通过创办3个带有验证测试的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.

译文:若是您提供3个字符串,那么路由将字符串作为1个正则表达式来拍卖,并通过调用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.

葡萄娱乐官方 13

 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 U大切诺基L Pattern(找到与U凯雷德L格局匹配的物理文件)

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
UQashqaiL Pattern(为UCRUISERL情势显式禁止使用路由)

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  

译文:您还足以钦定路由不应该处理某个UTiggoL请求。通过定义一条路由,并钦赐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 U君越Ls 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:

译文:当路由拍卖ULacrosseL请求时,它尝试将请求的U奔驰M级L与路由拾贰分。将USportageL请求匹配到路由取决于以下原则:

  • 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永远不会处理请求。第二条大概是对准每月报告的,而路由2恐怕是本着年度报告的。可是,路由第11中学的默许值意味着它将万分任何或然用于路由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路由不处理请求。相反,处理被传送给1个ASP.NET
Page ,Web服务,或任何ASP.NET端点。

2.12 路由二义性

只在同3个消除方案中,存在多少个以及上述同等控制器下的相同action,当U卡宴L请求时,会油可是生二义性。

二义性德姆o目录结构

葡萄娱乐官方 14

RouteConfig.cs

葡萄娱乐官方 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;
 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

葡萄娱乐官方 17葡萄娱乐官方 18

 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

葡萄娱乐官方 19葡萄娱乐官方 20

 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

测试结果

葡萄娱乐官方 21

3 路由概述(性子路由)

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

 从内容上来看,脾气路由的内容与古板路由大概,同样有路由U奥迪Q3L、路由值、控制器路由、路由约束和路由暗许值等。鉴于篇幅限制,在此地就差不多的概述一下,不作详细阐释,早先时期有时间或然有情侣须求,再论述。

 定义:本性路由即是将路由UCRUISERL定义在控制器上或控制器内的法子上,而不像守旧路由将路由U奥迪Q5L定义在RouteConfig.cs中。比较如下

葡萄娱乐官方 22

 

葡萄娱乐官方 23

3 路由生成ULANDL

 
 路由多个首要职分:匹配传入的ULANDL请求和协会与特定路由对应的U卡宴L,回顾之匹配U哈弗L和布局U奥迪Q5L。在生成UCR-VL时,生成UPAJEROL的情致应该首先与选取用来生成UXC90L的路由相匹配,那样路由就足以在拍卖传入或传播的ULX570L时改为完全的双向系统。原则上,开发职员应该提供一组路由值,以便路由系统从中选中第一个能够匹配UCRUISERL的路由。

 3.1 U路虎极光L生成的高层系概述

 
路由的主导是一个非凡简单的算法,该算法基于一个由RouteCollection类和RouteBase类组成的粗略抽象对象。能够接纳种种艺术来生成U帕杰罗L,但那个艺术都是调用RouteCollection.GetVirtualPath的多少个重载方法而得了。RouteCollection.GetVirtulPath方法公有八个重载版本,上面包车型大巴代码展现它们的不二法门签名:

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

 第1个重载版本接受当前的RequestContext,以及由用户钦点的路由值(字典)。

(1)路由集合通过RouteBase.GetVirtualPath方法遍历各样路由并走访:“可以转变给定参数的U本田CR-VL吗”,这么些进度看似于在路由与传播请求匹配时所运用的匹配逻辑。

(2)如若四个路由能够应对上面的题材(即匹配),那么它就会重临一个带有了UHighlanderL的VirTualPathData实例以及其余匹配的信息。不然,它就回去空值,路由体制移向列表中的下五个路由。

第3个重载接受多少个参数,个中第二个参数是路由名称。在路由集合中路由名称是绝无仅有的,也便是说,没有多个差其他路由具有同样的名目。当内定了路由名称时,路由集合就不须要循环遍历各类路由,相反,它能够立即找到钦命名称的路由,并移向上面的步子(2)。借使找到的路由无法合营钦定的参数,该方法就会回来空值,并且不再匹配其余路由。

  3.2  U奥迪Q5L生成详解

 
(1)开发职员调用像Html.ActionLink或Url.Action之类的章程,那些主意反过来再调用RouteCollection.GetVirtualPath方法,并向它传递二个RequestContext对象、2个富含值的字典以及用于选取生成UPRADOL的路由名称(可选参数)。

 (2)路由体制查看须要的路由参数(即没有提供路由参数的默许值),并确定保证提供的路由值字典为每三个渴求的参数提供八个值,不然,U瑞鹰L生成程序就会应声终止,并赶回空值。

 (3)一些路由恐怕含有没有对应路由参数的默许值。如路由可能为category键提供暗中认可值“pastries”,不过cateory不是路由UCRUISERL的一个参数,那种场地下,假如用户传入的路由值字典为category提供了一个值,那么该值必须匹配category的暗中同意值。

 (4)然后路由系统接纳路由约束。

(5)路由分外成!以后得以由此翻看每多个路由参数,并尝试使用字典中的对应值填充相应参数,进而生成UHighlanderL。

能够包含为如下流程图:

葡萄娱乐官方 24

 

4 路由绑定到操作

 在这一章节,主要分析UCR-VL绑定到控制器操作的底部细节,分析底层原理,明白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转而回到3个达成了IHttpHandler接口的MvcHandler对象。再次来到的MvcHandler对象重要用来实例化控制器,并调
       用该实例化的控制器上的操作方法。

4.2 路由数量

   
调用GetRouteData方法会重临RouteData的一个实例。RouteData中带有了有关匹配请求的路由音信。

   
如UXC60L:{Controller}/{action}/{id}。当请求/albums/list/123扩散时,该路由就会尝试匹配传入的呼吁,倘使匹配成功,它就创办3个字典,在那之中蕴藏了从U奥迪Q7L中分析出的消息。确切地讲,路由还会向Values字典中为U奥迪Q7L中的每一个路由参数添加叁个键;对于古板路由{Controller}/{action}/{id},Values字典中应有至少含有多个键,分别是Controller,action和id,假设传入的U奇骏L是对/albums/list/123的伏乞,路由就会分析该请求的URAV4L,并为字典的键提供值。本例中,字典中“Controller”键的值为albums,”action”键的值为“list”,”id”键的值是“123”;对于本性路由MVC使用DataTokens字典来储存更规范的音讯,而不是操作名称字符串。具体来说,它富含1个操作描述符列表,那个描述符间接指向路由匹配时或然使用的操作方法。对于控制器级其余特征路由,列表上将有随处二个操作。在漫天MVC中都有使用的RequestContext的RouteData属性保存着外面路由值。

5 路由调节和测试

 
 使用RouteDebugger调节和测试,启用RouteDebugger后,它会用几个DebuggerRouteHandler替换全数路由处理程序,DebugRouteHandler截获全体传入的乞请,并查询路由表中的每3个路由,以便在页面尾部显示路由的诊断数据和参数。为利用RouteDebugger,只需在VS的Package
Manager Console窗口中行使NuGet安装即可,命令Install-Package
routedebugger.。RouteDebugger包在添加Route
Debugger程序集的还要。也在web.config文件的appSettings节点中添加二个装置,用来拉开或禁止使用路由调节和测试。

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

 只要启用RouteDebugger,它就显得从(在地方栏中)当前恳请UWranglerL中领到的路由数据。如此,能够在地点栏中输入种种UXC60L,并查看输入的ULX570L能与哪些路由十分,在页面头部,它还会显得3个分包应用程序定义的所用路由列表,那样能够查阅定义的哪位路由能够与当下UCR-VL相匹配。

设置教程如下:

视图=>其余窗口=>程序包管控台

葡萄娱乐官方 25

在窗口中输入:Install-Package
routedebugger

葡萄娱乐官方 26

要么也足以运用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>

 

葡萄娱乐官方 27

6 与路由相关的第1命名空间和类

 6.1  路由涉及的命名空间

葡萄娱乐官方 28

 6.2 Class
Reference( 路由涉及到的关键类)

葡萄娱乐官方 29

 

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/。
  • 极少一些文章利用读书、参考、引用、抄袭、复制和粘贴等各个措施组成而成的,半数以上为原创。
  • 如您喜爱,麻烦推荐一下;如你有新想法,欢迎提议,邮箱:贰零壹伍177728@qq.com。
  • 能够转发该博客,但不可能不有名博客来源。