HTML5技术

【ASP.NET MVC 牛刀小试】 ASP.NET MVC 路由 - Alan_beijing(8)

字号+ 作者:H5之家 来源:H5之家 2017-06-29 11:01 我要评论( )

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

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

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

(1)路由集合通过RouteBase.GetVirtualPath方法遍历每个路由并访问:“可以生成给定参数的URL吗”,这个过程类似于在路由与传入请求匹配时所运用的匹配逻辑。

(2)如果一个路由可以应答上面的问题(即匹配),那么它就会返回一个包含了URL的VirTualPathData实例以及其他匹配的信息。否则,它就返回空值,路由机制移向列表中的下一个路由。

第二个重载接受三个参数,其中第二个参数是路由名称。在路由集合中路由名称是唯一的,也就是说,没有两个不同的路由具有相同的名称。当指定了路由名称时,路由集合就不需要循环遍历每个路由,相反,它可以立即找到指定名称的路由,并移向上面的步骤(2)。如果找到的路由不能匹配指定的参数,该方法就会返回空值,并且不再匹配其他路由。

  3.2  URL生成详解

  (1)开发人员调用像Html.ActionLink或Url.Action之类的方法,这些方法反过来再调用RouteCollection.GetVirtualPath方法,并向它传递一个RequestContext对象、一个包含值的字典以及用来选择生成URL的路由名称(可选参数)。

 (2)路由机制查看要求的路由参数(即没有提供路由参数的默认值),并确保提供的路由值字典为每一个要求的参数提供一个值,否则,URL生成程序就会立即停止,并返回空值。

 (3)一些路由可能包含没有对应路由参数的默认值。如路由可能为category键提供默认值“pastries”,但是cateory不是路由URL的一个参数,这种情况下,如果用户传入的路由值字典为category提供了一个值,那么该值必须匹配category的默认值。

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

(5)路由匹配成!现在可以通过查看每一个路由参数,并尝试利用字典中的对应值填充相应参数,进而生成URL。

可以概括为如下流程图:

 

4 路由绑定到操作

 在这一章节,主要分析URL绑定到控制器操作的底层细节,分析底层原理,理解ASP.NET请求管道。注意,目前路由不仅仅只是ASP.NET MVC的一个特性了,它已经超过这个范围,如ASP.NET Dynamic Data。路由既不包括MVC的内部知识,也不依赖于MVC。

 4.1 高层次请求的路由管道

  当ASP.NET 处理请求时,路由管道主要由以下几步组成:

   (1)UrlRoutingModule尝试使用在RouteTable中注册的路由匹配当前请求。

   (2)如果RouteTable中有一个路由成功匹配,路由模块就会从匹配成功的路由中获取IRouteHandler接口对象。

   (3)路由模块调用IRouteHandler接口的GetHandler方法,并返回用来处理请求的IHttpHandler对象。

   (4)调用HTTP处理程序中的ProcessRequest方法,然后把要处理的请求传递给它

   (5)在ASP.NET MVC中,IRouteHandler是MvcRouteHandler类的一个实例,MvcRouteHandler转而返回一个实现了IHttpHandler接口的MvcHandler对象。返回的MvcHandler对象主要用来实例化控制器,并调        用该实例化的控制器上的操作方法。

4.2 路由数据

    调用GetRouteData方法会返回RouteData的一个实例。RouteData中包含了关于匹配请求的路由信息。

    如URL:{Controller}/{action}/{id}。当请求/albums/list/123传入时,该路由就会尝试匹配传入的请求,如果匹配成功,它就创建一个字典,其中包含了从URL中解析出的信息。确切地讲,路由还会向Values字典中为URL中的每个路由参数添加一个键;对于传统路由{Controller}/{action}/{id},Values字典中应该至少包含三个键,分别是Controller,action和id,如果传入的URL是对/albums/list/123的请求,路由就会解析该请求的URL,并为字典的键提供值。本例中,字典中“Controller”键的值为albums,"action"键的值为“list”,"id"键的值是“123”;对于特性路由MVC使用DataTokens字典来存储更精确的信息,而不是操作名称字符串。具体来说,它包含一个操作描述符列表,这些描述符直接指向路由匹配时可能使用的操作方法。对于控制器级别的特性路由,列表中将有不止一个操作。在整个MVC中都有用到的RequestContext的RouteData属性保存着外界路由值。

5 路由调试

   使用RouteDebugger调试,启用RouteDebugger后,它会用一个DebuggerRouteHandler替换所有路由处理程序,DebugRouteHandler截获所有传入的请求,并查询路由表中的每一个路由,以便在页面底部显示路由的诊断数据和参数。为使用RouteDebugger,只需在VS的Package Manager Console窗口中使用NuGet安装即可,命令Install-Package routedebugger.。RouteDebugger包在添加Route Debugger程序集的同时。也在web.config文件的appSettings节点中添加一个设置,用来开启或禁用路由调试。

value="true'>

 只要启用RouteDebugger,它就显示从(在地址栏中)当前请求URL中提取的路由数据。如此,可以在地址栏中输入各种URL,并查看输入的URL能与哪个路由匹配,在页面底部,它还会展示一个包含应用程序定义的所用路由列表,这样可以查看定义的哪个路由能够与当前URL相匹配。

安装教程如下:

视图=>其他窗口=>程序包管理控制台

在窗口中输入:Install-Package routedebugger

或者也可以使用NuGet很方便的安装RouteDebugger,在项目上面右键-"Manage NuGet Packages"-"Online"输入"RouteDebugger"然后"Install".

当然, 你也可以自己下载RouteDebugger.dll, 引用到web项目中, 然后手动在web.config中加入

value=/>

测试结果

RouteConfig.cs

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Asp.Net WebForm生命周期的详解 - 天使不哭

    Asp.Net WebForm生命周期的详解 - 天使不哭

    2017-06-15 09:00

  • 关于ASP.NET WebForm与ASP.NET MVC的比较 - 天使不哭

    关于ASP.NET WebForm与ASP.NET MVC的比较 - 天使不哭

    2017-06-09 09:02

  • [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗? - Emrys5

    [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗? - Emr

    2017-06-02 13:00

  • Amazing ASP.NET Core 2.0 - Savorboard

    Amazing ASP.NET Core 2.0 - Savorboard

    2017-05-25 14:00

网友点评
(