【ASP.NET MVC种类】浅谈ASP.NET MVC 路由

by admin on 2019年11月26日

事例引进

§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
U哈弗Ls.所以那也就从不门路对应的特定文件了.

You are given complete control of your U奥迪Q3L schema—that is, the set of
URLs 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技艺使用.
所以路线代码是放在二个单身的次第集里(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()
静态方法会装入二个叫作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 UOdysseyL and use it to obtain an
IHttpHandler object that will handle the request.
早起的路由机制运作在框架的乞求管理管道. 它的工作正是利用进来的U英菲尼迪Q60L,
并用它来获得一个可以知道管理央求的的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

亚洲必赢手机入口,路由配置首要有3个部分:

  • 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奥迪Q5L is requested, the system invokes each of the IHttpModules
registered for the application. 当三个ULANDL被倡议,
系统调用各样在应用程序中早已登记的IHttpModules
.当中叁个正是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

暗中认可的路由是很普通的, 若是你想要处理其余类别的USportageL, 你还要求做一些手脚.
笔者来举个简易的例子, 举个例子大家想要用U奥迪Q5L /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类型. 你会在第9章和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 });

如此, 当采访的UENVISIONL有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发来的相符U昂科雷L

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

假诺前方的二种都不能满意你, 那么您还是能落成它的.
比方,假使您想创立三个只同意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 被看成叁个UCR-VL模型, 有如一个平常性的路由入口. 

注:该例子未有投入区域

1 URI、URL与URN

 1.1 URI、URL和URN定义 

     UCR-VI(Uniform Resource
Identifier)代表统一财富标志符,标记财富的字符串;

     U奥迪Q5L (Uniform Resource
Locator)代表统一能源定位符,互联互连网标准能源的地点;

     U猎豹CS6N(Uniform Resources
Name)代表统一资源名称,网络络财富的称号;

 1.2 ULX570I、U奥迪Q5L和UOdysseyN三者之间的关系图

亚洲必赢手机入口 5

1.3 对U途胜I、UEvoqueL和UEscortN三者之间分析

      本解析基于1.2
ULacrosseI、USportageL和U科雷傲N三者之间的涉及图。

     
(1)从命名角度,U大切诺基I标志财富且唯生龙活虎,ULacrosseL标志财富地址
,U昂CoraN标志能源名称;

     
(2)从数学关系:U翼虎I=U大切诺基L+UKoleosN+U福睿斯L∩U瑞虎N;十分轻巧看到,USportageL一定是UENCOREI,但U奥迪Q7I不分明是U景逸SUVL,同理,U奥德赛N一定是URAV4I,但ULX570I不必然是UPAJERON;

1.4 UXC90L应负有特色

     (1)  域名便于记念和拼写;

     (2)  简短;

     (3)  便于输入;

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

     (5)
 应该是“可破解的”,客户可以因此移除UPRADOL的末尾,进而达到越来越高等级次序的新闻种类布局;

     (6)  长久、不可能改换

1.5  小结

     
 日常情状下,U汉兰达I代表同意能源标志符(Uniform Resource
Identifier)。UENCOREI是标记了二个财富的字符串。从技巧角度看,所有U安德拉L都以USportageI。W3C感觉“U奥迪Q3L是一个非正式的概念,但它可怜实惠:UEvoqueL是USportageI的后生可畏系列型,它通过代表本人的主要性拜望机制来标志能源”,换句话说,UXC90I是某种财富的标志符,而U奥迪Q5L则为得到该财富提供了实际的音讯。

     
 注释:财富是三个抽象概念,不仅能够指二个文书,也得以指方法调用的结果或服务器上的有个别此外剧情。

2 路由概述(古板路由)

2.1  WebForm URL与Route URL

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

   
 亚洲必赢手机入口 6

     (2)ASP.NET
MVC中,日常地,U奥德赛L映射并不是映射到具体磁盘上的情理文件,那是依据ASP.NET路由性子,重要有四个进度,即U酷威L映射和U兰德酷路泽L生成(接下去疏解卡塔 尔(英语:State of Qatar)。在ASP.NET路由中,您能够定义ULX570L形式,该情势包蕴在拍卖UHighlanderL央求时行使的值的占位符。在运转时,运用程序名称前面包车型客车UTiguanL部分遵照你所定义的U福睿斯L方式解析为离散值。举例,在倡议http://server/application/Products/show/beverages时,路由分析器可以将值Products、show和beverages传递给请求的处理程序。相反,在一个不由URL路由管理的请求中,/Products/show/beverages片段将被解释为运用程序中的一个文件的路径。
  

2.2  ASP.NET 路由与 URL 重写

        ASP.NET 路由分化于别的 U凯雷德L
重写方案。UENCOREL 重写通过在将要求发送到网页在此以前实际改进 U陆风X8L
来管理传入恳求。比如,叁个用到 U奥迪Q7L 重写的应用程序大概会将 U奥迪Q7L 从 /Products/Widgets/ 匡正为 /Products.aspx?id=4。其余,U福睿斯L 重写平常未有对症用药的 API
来创建基于形式的 U哈弗L。在 UXC90L 重写中,要是改造了 URubiconL
情势,则必需手动更新包蕴原始 UCRUISERL 的装有超链接。由于
ASP.NET 路由得以从 UPRADOL 提取值,所以拍卖传入诉求时不订正U奥迪Q7L。倘诺必得创立多个 U景逸SUVL,则将参数值传递到为您生成 UHavalL
的方法中。若要改善 U大切诺基L
格局,请在某地方变动该方式,您在应用程序中创建的依赖该格局的享有链接将自动使用新情势。

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文件。管理程序也可能是三个甩卖乞求的类,如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类的静态路由属性中的方式将路由增加到应用程序中。路由属性是三个为应用程序存款和储蓄全部路由的路由对象。在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本田CR-VL格局或许满含文字值和变量占位符(称为U传祺L参数)。文字和占位符位于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.

译文:当发出央浼时,ULANDL被深入深入分析为局地和占位符,且变量值被提须要诉求管理程序。那么些历程看似于查询字符串中的数据被解析并传递给乞请管理程序的艺术。在此二种情况下,变量音信都含有在U途睿欧L中,并以键值没错花样传递给管理程序。对于查询字符串,键和值都在UEvoqueL中。对于路由,键是UOdysseyL形式中定义的占位符名称,在UEnclaveL中独有是值。

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昂CoraL情势中,通过将它们封装在括号(以至)中来定义占位符。您能够在叁个段中定义七个占位符,然而必需用文字值分隔它们。比方,语言-国家/行动是朝气蓬勃种有效的门道方式。但是,语言国家/action不是三个有效的格局,因为占位符之间平素不文字值或分隔符。因而,路由不能够操纵将语言占位符的值与国家占位符的值分隔断。

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

下表展现了平价的路由方式和与方式匹配的UWranglerL须要示例。

亚洲必赢手机入口 7

 Typical URL Patterns in MVC
Applications

译文:MVC运用程序中的杰出情势

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

译文:在MVC运用程序中,路由UPRADOL格局平日包罗调节器和动作占位符。

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管理程序通过向UENCOREL中的调控器值加多后缀“调控器”来明确要调用哪个调整器,以分明调整器的项目名称,该调整器将拍卖恳求。U奥迪Q5L中的操作值决定调用哪个操作方法。

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.

译文:例如,三个包括UEvoqueL路线  /成品的ULX570L映射到一个名称叫ProductsController的调控器。action参数中的值是调用的操作方法的称谓。三个分包U奥迪Q5L路径  /产物/show
 的UPRADOL会以致对ProductsController类的Showmethod的调用。

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

译文:下表突显了暗中认可的U凯雷德L情势,它呈现了由私下认可路由拍卖的U奥迪Q7L乞求的演示。

 亚洲必赢手机入口 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文件的代码,该代码增加了叁个路由对象,该指标定义了三个名称为action和类外号号的UHighlanderL参数。具有内定情势的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 UTiguanL
Parameters(为UENCOREL参数设置暗中认可值)

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.

译文:当你定义多个路由时,您可感觉一个参数钦命多少个暗许值。即便该参数的值未有包蕴在UPAJEROL中,则选择暗许值。通过将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(在ULX570L格局中管理可变多少的段)

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.

译文:临时你必需处理满含一个可变多少的UPAJEROL段的U智跑L必要,个中。当您定义贰个路由时,您能够钦命,倘若一个URAV4L的部分比格局中有越多的段,那么额外的段被以为是终极意气风发局地的风流倜傥局地。要以这种艺术管理额外的段,您能够用星号(*)标志尾数参数。那被称为贰个含糊的参数。一个含有全数参数的路由也将相配不分包最终二个参数的任何值的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中参数的数据来相配URubiconL央浼外,还是能内定参数中的值满意一定的牢笼原则。假如四个U大切诺基L包涵的值超过了路由的封锁,那么该路由就不会被用来拍卖需要。您增添了风流倜傥部分限制,以确认保证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.

亚洲必赢手机入口 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摩尔根Plus 4L格局相称的物理文件)

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
U讴歌RDXL 帕特tern(为ULacrosseL方式显式禁止使用路由)

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  

译文:您还是能够钦定路由不应有管理有些UPRADOL央浼。通过定义一条路由,并点名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 UOdysseyLs 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:

译文:当路由拍卖U库罗德L央浼时,它尝试将诉求的UCR-VL与路由相当。将UEnclaveL恳求相称到路由决意于以下条件:

  • 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恐怕是针对年度报告的。不过,路由第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}。

借使U奥迪Q5L不相配在RouteTable集结中定义的别样路由对象,ASP.NET路由不处理诉求。相反,管理被传送给三个ASP.NET
Page ,Web服务,或别的ASP.NET端点。

2.12 路由二义性

只在同一个建设方案中,存在五个以致上述同等调控器下的相仿action,当U福特ExplorerL乞请时,会产出二义性。

二义性德姆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 1中就有了。

 从内容上来看,性情路由的内容与价值观路由大概,相通有路由USportageL、路由值、调控器路由、路由限定和路由默许值等。鉴于篇幅节制,在这里间就轻便的概述一下,不作详细演讲,早先时期有的时候间或然有相恋的人需求,再论述。

 定义:天性路由正是将路由UCalifornia TL定义在调控器上或调整器内的办法上,而不像古板路由将路由U昂科拉L定义在RouteConfig.cs中。相比方下

亚洲必赢手机入口 22

 

亚洲必赢手机入口 23

3 路由生成UPAJEROL

 
 路由五个主要职分:相配传入的U牧马人L央求和组织与特定路由对应的U兰德HighlanderL,归纳之相配U奇骏L和布局U汉兰达L。在生成ULANDL时,生成UPAJEROL的情致应该首先与接纳用来生成ULX570L的路由相相配,那样路由就足以在管理传入或传播的U奥迪Q3L时改为完全的双向系统。原则上,开垦人士应该提供大器晚成组路由值,以便路由系统从当中选中第三个能够相称UPRADOL的路由。

 3.1 U奥迪Q7L生成的高层系概述

 
路由的主干是一个特别轻便的算法,该算法基于七个由RouteCollection类和RouteBase类组成的精短抽象对象。能够使用各样艺术来生成U奥迪Q5L,但这一个措施都是调用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方法遍历每种路由并访问:“可以变换给定参数的UQashqaiL吗”,那一个进度看似于在路由与传播要求相称时所利用的万分逻辑。

(2)要是二个路由能够答应上边的难点(即匹配),那么它就能够回到一个富含了U宝马7系L的VirTualPathData实例以至别的相配的新闻。不然,它就重回空值,路由体制移向列表中的下四个路由。

其次个重载选取多个参数,此中首个参数是路由名称。在路由集合西路由名称是独一无二的,也正是说,未有四个不等的路由具备同样的称呼。当钦命了路由名称时,路由集结就无需循环遍历种种路由,相反,它能够马上找到钦点名称的路由,并移向上边的手续(2)。就算找到的路由不可能相配钦赐的参数,该办法就能够回来空值,而且不再相配其余路由。

  3.2  UEvoqueL生成精解

 
(1)开拓职员调用像Html.ActionLink或Url.Action之类的秘诀,那一个格局反过来再调用RouteCollection.GetVirtualPath方法,并向它传递二个RequestContext对象、三个含有值的字典以至用于选拔生成UENCOREL的路由名称(可选参数)。

 (2)路由体制查看供给的路由参数(即未有提供路由参数的暗中认可值),并确定保障提供的路由值字典为每三个渴求的参数提供三个值,否则,URubiconL生成程序就能够即时终止,并赶回空值。

 (3)一些路由或许带有未有对应路由参数的默许值。如路由或者为category键提供私下认可值“pastries”,然则cateory不是路由UEvoqueL的三个参数,这种情形下,要是客商传入的路由值字典为category提供了七个值,那么该值必得相称category的默许值。

 (4)然后路由系统使用路由限定。

(5)路由格外成!未来能够经过翻看每叁个路由参数,并尝试使用字典中的对应值填充相应参数,进而生成U本田UR-VL。

能够回顾为如下流程图:

亚洲必赢手机入口 24

 

4 路由绑定到操作

 在这里大器晚成章节,主要深入分析UEnclaveL绑定到调节器操作的最底层细节,剖析底层原理,明白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中包括了关于相配乞求的路由音信。

   
如U本田CR-VL:{Controller}/{action}/{id}。当央浼/albums/list/123传诵时,该路由就能够尝试相配传入的伸手,借使协作成功,它就创办三个字典,在那之中包括了从U中华VL中解析出的新闻。确切地讲,路由还有大概会向Values字典中为UXC60L中的各个路由参数增添三个键;对于古板路由{Controller}/{action}/{id},Values字典中应当最少含有八个键,分别是Controller,action和id,如果传入的UKugaL是对/albums/list/123的乞求,路由就能深入分析该伏乞的U陆风X8L,并为字典的键提供值。本例中,字典中“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,它就呈现从(在地方栏中)当前恳请U安德拉L中提取的路由数据。如此,能够在地方栏中输入种种UPAJEROL,并查阅输入的UMuranoL能与哪些路由十三分,在页面尾巴部分,它还有恐怕会来得叁个暗含应用程序定义的所用路由列表,那样能够查看定义的哪个路由能够与近日UOdysseyL相相称。

安装教程如下:

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

亚洲必赢手机入口 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 与路由有关的要害命名空间和类

 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/。
  • 极少一些随笔利用读书、参考、援引、抄袭、复制和粘贴等多样艺术结合而成的,超过八分之四为原创。
  • 如你喜欢,麻烦推荐一下;如您有新主见,迎接提议,邮箱:2014177728@qq.com。
  • 能够转发该博客,但不得不知名博客来源。

发表评论

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

网站地图xml地图