有的人不想让外人掌握自身文件的门道,例子引进

事例引进

§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
UKoleosLs.所以这也就从未渠道对应的特定文件了.

You are given complete control of your UOdysseyL schema—that is, the set of
U奥迪Q5Ls 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 U奥迪Q5L and use it to obtain an
IHttpHandler object that will handle the request.
早起的路由机制运作在框架的乞请管理管道. 它的职业正是利用进来的URAV4L,
并用它来赢得三个力所能致管理央求的的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 UPRADOL is requested, the system invokes each of the IHttpModules
registered for the application. 当四个U本田UR-VL被呼吁,
系统调用每种在应用程序中已经登记的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

暗中认可的路由是很平凡的, 假如你想要管理别的项指标U奥迪Q5L, 你还需求做一些手脚.
我来举个简易的例子, 比方我们想要用U翼虎L /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 });

这么, 当访问的URAV4L有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 被作为二个U昂CoraL模型, 就疑似三个常见的路由入口. 

注:该例子未有参加区域

1 URI、URL与URN

 1.1 URI、URL和URN定义 

     URAV4I(Uniform Resource
Identifier)代表统一能源标志符,标志财富的字符串;

     ULX570L (Uniform Resource
Locator)代表统一财富定位符,互联网络正式财富的地方;

     U奇骏N(Uniform Resources
Name)代表统一财富名称,互联网络能源的名号;

 1.2 UENCOREI、U宝马7系L和U福睿斯N三者之间的涉嫌图

图片 5

1.3 对U奥迪Q5I、UEvoqueL和U中华VN三者之间分析

      本深入分析基于1.2
U福睿斯I、U奥迪Q5L和U纳瓦拉N三者之间的关联图。

     
(1)从命名角度,U凯雷德I标记能源且独一,UGL450L标志能源地址
,UEscortN标志能源名称;

     
(2)从数学关系:U福特ExplorerI=UQashqaiL+U兰德猎豹CS6N+UOdysseyL∩UHavalN;很轻便看到,U福特ExplorerL一定是USportageI,但U宝马X3I不自然是UHighlanderL,同理,U瑞鹰N一定是U牧马人I,但UXC60I不肯定是USportageN;

1.4 UPRADOL应具备特色

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

     (2)  简短;

     (3)  便于输入;

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

     (5)
 应该是“可破解的”,客商能够通过移除URAV4L的最后,从而到达更加高档次的音讯体系布局;

     (6)  长久、无法更换

1.5  小结

     
 平日意况下,UTiguanI代表同意财富标记符(Uniform Resource
Identifier)。ULANDI是标志了一个财富的字符串。从本事角度看,全数U陆风X8L都以UEvoqueI。W3C以为“UTucsonL是一个业余的定义,但它不行平价:UCRUISERL是U奥迪Q5I的一种档期的顺序,它经过代表我的关键拜见机制来标记能源”,换句话说,UMercedes-迈巴赫I是某种财富的标志符,而UHavalL则为获得该能源提供了现实的音讯。

     
 注释:能源是二个抽象概念,不仅能够指三个文本,也足以指方法调用的结果或服务器上的一部分其它内容。

2 路由概述(守旧路由)

2.1  WebForm URL与Route URL

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

   
 图片 6

     (2)ASP.NET
MVC中,经常地,U传祺L映射实际不是映射到现实磁盘上的物理文件,那是基于ASP.NET路由天性,首要有四个经过,即U中华VL映射和U奥迪Q5L生成(接下去解说)。在ASP.NET路由中,您能够定义U福睿斯L形式,该格局包罗在管理ULacrosseL要求时行使的值的占位符。在运转时,运用程序名称前面包车型地铁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
重写方案。U猎豹CS6L 重写通过在将诉求发送到网页此前实际改造 U兰德酷路泽L
来管理传入哀告。比方,二个施用 U哈弗L 重写的应用程序或许会将 U奇骏L 从 /Products/Widgets/ 改变为 /Products.aspx?id=4。其它,U揽胜极光L 重写常常未有相应的 API
来创建基于方式的 U大切诺基L。在 ULX570L 重写中,假使退换了 USportageL
情势,则必得手动更新富含原始 UPAJEROL 的具备超链接。由于
ASP.NET 路由得以从 UWranglerL 提取值,所以拍卖传入伏乞时不更换U奥迪Q7L。假如非得创制多个 UEscortL,则将参数值传递到为你生成 U科雷傲L
的措施中。若要退换 UENVISIONL
格局,请在某地方变动该形式,您在应用程序中开创的基于该方式的有所链接将电动使用新格局。

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.

     
 译文:路由是一种被映射到有个别管理程序的UTiguanL格局。管理程序大概是三个物理文件,如在WebForms运用程序中的aspx文件。管理程序也说不定是一个管理乞求的类,如MVC应用程序中的调节器。要定义路由,您能够经过点名UHavalL方式、管理程序和路线的名目来成立路由类的实例。

      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奥迪Q7L路由。那一个都以在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.

译文:UWranglerL方式大概满含文字值和变量占位符(称为ULX570L参数)。文字和占位符位于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.

译文:当发出央求时,U安德拉L被深入分析为部分和占位符,且变量值被提须要乞求管理程序。这一个进度看似于查询字符串中的数据被深入分析并传递给诉求管理程序的点子。在那二种情景下,变量消息都含有在UGL450L中,并以键值对的样式传递给管理程序。对于查询字符串,键和值都在U本田UR-VL中。对于路由,键是U凯雷德L形式中定义的占位符名称,在U奥迪Q5L中独有是值。

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.

译文:在UEnclaveL格局中,通过将它们封装在括号(以及)中来定义占位符。您能够在一个段中定义多少个占位符,不过必需用文字值分隔它们。比方,语言-国家/行动是一种有效的路径格局。但是,语言国家/action不是一个可行的形式,因为占位符之间未有文字值或分隔符。因而,路由不可能决定将语言占位符的值与国家占位符的值分隔开。

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

下表呈现了平价的路由方式和与形式相配的UQX56L诉求示例。

图片 7

 Typical URL Patterns in MVC
Applications

译文:MVC运用程序中的特出形式

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

译文:在MVC运用程序中,路由UCRUISERL格局日常包蕴调整器和动作占位符。

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奥迪Q7L中的调整器值增多后缀“调节器”来鲜明要调用哪个调节器,以鲜明调整器的项目名称,该调整器将拍卖需要。UWranglerL中的操作值决定调用哪个操作方法。

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凯雷德L路线  /产品
的U奥迪Q5L映射到二个名字为ProductsController的调控器。action参数中的值是调用的操作方法的称呼。三个分包U奥迪Q7L路径  /产品/show
 的U帕杰罗L会形成对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奥迪Q5L方式,它呈现了由默许路由拍卖的UKugaL必要的亲自去做。

 图片 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奥迪Q5L方式中,如上面包车型大巴事例:

 图片 9

 如在VS2012行使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和项目称号的ULANDL参数。具备钦命方式的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 U奥迪Q5L
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.

译文:当你定义贰个路由时,您可感觉贰个参数钦赐一个默许值。假诺该参数的值未有包括在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福特ExplorerL Pattern(在U普拉多L格局中拍卖可变多少的段)

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.

译文:一时你必得管理包蕴三个可变多少的UCRUISERL段的U酷威L恳求,在那之中。当您定义贰个路由时,您能够钦定,假若一个UHavalL的一些比方式中有越多的段,那么额外的段被认为是最后一有的的一局地。要以这种艺术管理额外的段,您能够用星号(*)标识最终三个参数。这被叫做二个含糊的参数。二个带有全部参数的路由也将非常不含有最后一个参数的任何值的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.

译文:除了通过ULANDL中参数的数码来相配U宝马X5L央浼外,还足以钦命参数中的值满足特定的羁绊规范。假诺二个U奇骏L包涵的值超越了路由的牢笼,那么该路由就不会被用于拍卖乞求。您增添了一部分封锁,以确定保证UEscortL参数包罗在你的应用程序福建中华工程公司作的值。
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 URubiconL Pattern(找到与U奥迪Q7L情势相配的情理文件)

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福特ExplorerL Pattern(为U奇骏L方式显式禁止使用路由)

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  

译文:您还足以钦命路由不应有管理有些ULANDL乞求。通过定义一条路由,并钦点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:

译文:当路由拍卖U奥迪Q5L伏乞时,它尝试将伏乞的U大切诺基L与路由非常。将UPAJEROL供给相配到路由取决于以下规范:

  • 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}。

万一UHavalL不匹配在RouteTable群集中定义的任何路由对象,ASP.NET路由不管理诉求。相反,管理被传送给一个ASP.NET
Page ,Web服务,或另外ASP.NET端点。

2.12 路由二义性

只在同三个消除方案中,存在三个以及上述同等调节器下的同样action,当UWranglerL央求时,会并发二义性。

二义性Demo目录结构

图片 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大切诺基L、路由值、调整器路由、路由约束和路由暗中同意值等。鉴于篇幅限制,在此地就简单的概述一下,不作详细阐释,前期有时间可能有心上人必要,再论述。

 定义:性子路由正是将路由UEvoqueL定义在调整器上或调控器内的不二等秘书诀上,而不像守旧路由将路由UPAJEROL定义在RouteConfig.cs中。对举例下

图片 22

 

图片 23

3 路由生成UPAJEROL

 
 路由七个首要职务:相配传入的U库罗德L乞请和结构与一定路由对应的U昂CoraL,回顾之相称UWranglerL和协会USportageL。在生成UTiggoL时,生成USportageL的意味应该率先与选拔用来生成UKoleosL的路由相相称,那样路由就能够在拍卖传入或传播的USportageL时产生全体的双向系统。原则上,开采职员应该提供一组路由值,以便路由系统从中选中第一个能够相称U福特ExplorerL的路由。

 3.1 UEvoqueL生成的高层系概述

 
路由的宗旨是一个非常简单的算法,该算法基于叁个由RouteCollection类和RouteBase类组成的大致抽象对象。能够使用各类主意来生成URubiconL,但这几个办法都是调用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方法遍历每种路由并访问:“能够转移给定参数的UHavalL吗”,那个历程看似于在路由与传播央求相称时所选用的同盟逻辑。

(2)假如二个路由可以答应下边包车型大巴主题材料(即相配),那么它就能回到三个带有了UEvoqueL的VirTualPathData实例以及别的般配的新闻。不然,它就赶回空值,路由体制移向列表中的下贰个路由。

其次个重载接受多个参数,当中第3个参数是路由名称。在路由集结中路由名称是并世无双的,也正是说,未有三个例外的路由具备同等的名号。当内定了路由名称时,路由会集就无需循环遍历各样路由,相反,它能够即时找到钦命名称的路由,并移向下边包车型大巴手续(2)。借使找到的路由无法相称钦命的参数,该办法就能回来空值,况且不再相配别的路由。

  3.2  U福特ExplorerL生成详解

 
(1)开荒职员调用像Html.ActionLink或Url.Action之类的方法,那一个点子反过来再调用RouteCollection.GetVirtualPath方法,并向它传递一个RequestContext对象、三个饱含值的字典以及用于选取生成UOdysseyL的路由名称(可选参数)。

 (2)路由体制查看供给的路由参数(即未有提供路由参数的暗中同意值),并保管提供的路由值字典为每多个渴求的参数提供叁个值,否则,U大切诺基L生成程序就能够应声停下,并回到空值。

 (3)一些路由或者含有未有对应路由参数的暗许值。如路由只怕为category键提供默许值“pastries”,不过cateory不是路由U中华VL的三个参数,这种景色下,假若客商传入的路由值字典为category提供了二个值,那么该值必得相称category的私下认可值。

 (4)然后路由系统应用路由约束。

(5)路由格外成!今后得以经过翻看每三个路由参数,并尝试使用字典中的对应值填充相应参数,进而生成U奥迪Q7L。

能够包蕴为如下流程图:

图片 24

 

4 路由绑定到操作

 在这一章节,主要深入分析U奥德赛L绑定到调整器操作的最底层细节,深入分析底层原理,领会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中含有了关于相称要求的路由音信。

   
如UPRADOL:{Controller}/{action}/{id}。当诉求/albums/list/123传播时,该路由就能尝试相称传入的乞请,要是合作成功,它就创办二个字典,在那之中含有了从USportageL中深入分析出的音信。确切地讲,路由还有恐怕会向Values字典中为U奥迪Q5L中的每一种路由参数增加一个键;对于守旧路由{Controller}/{action}/{id},Values字典中应当至少含有三个键,分别是Controller,action和id,固然传入的U福睿斯L是对/albums/list/123的呼吁,路由就能分析该哀求的UTucsonL,并为字典的键提供值。本例中,字典中“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中领取的路由数据。如此,能够在地点栏中输入各样U途达L,并查阅输入的U奥迪Q3L能与哪些路由极度,在页面尾巴部分,它还或许会来得叁个富含应用程序定义的所用路由列表,那样能够查看定义的哪位路由能够与最近UWranglerL相相称。

安装教程如下:

视图=>别的窗口=>程序包管控台

图片 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/。
  • 极少一些文章利用读书、参谋、援用、抄袭、复制和粘贴等多样措施组成而成的,大多数为原创。
  • 如您垂怜,麻烦推荐一下;如你有新主张,款待提议,邮箱:二零一六177728@qq.com。
  • 能够转发该博客,但必须出名博客来源。