码迷,mamicode.com
首页 > Web开发 > 详细

asp.net 路由学习四

时间:2015-07-29 11:53:42      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

8.链接和url的生成

   ASP.NET路由系统总的功能可以描述为实现两个方向的路由解析,即针对入栈请求拿到请求的路由和出栈url的生成。对此,ASP.NET MVC定义了两个帮助类,分别为HtmlHelper类和UrlHelper类,这两个类可以根据注册的路由规则生成相应的链接或者url。从本质上来看,这2个类还是依赖于前面的GetVirtualPathData方法。接下来先来看一下UrlHelper类的部分代码

public class UrlHelper
        {
            public UrlHelper(RequestContext requestContext);
            public UrlHelper(RequestContext requestContext, RouteCollection routeCollection);
            //从这两个属性可以看出,一个UrlHelper对象实际上就是对请求上下文RequestContext对象和路由表RouteCollection对象的封装
            //如果在构造UrlHelper的时候没有通过参数指定RouteCollection对象,那么通过RouteTable的静态属性Routes表示的全局路由表将会被使用
            public RequestContext RequestContext { get; }
            public RouteCollection RouteCollection { get; }
            //多个重载的action方法
            public string Action(string actionName);//多个重载的RouteUrl方法public string RouteUrl(RouteValueDictionary routeValues);
        }

    HtmlHelper类和UrlHelper类的基本原理都差不多,只是HtmlHelper只在View中使用,因此我现在主要学习UrlHelper类。接下来根据书上的例子尝试创建等效帮助类,

            public string Action(string actionName, string controllerName = null, RouteValueDictionary routeValues = null, string protocol = null, string hostName = null)
            {
                //可以看到,如果controllerName为空,则会获取当前Controller名称
                controllerName = controllerName ?? this.RequestContext.RouteData.GetRequiredString("controller");
                RouteValueDictionary routeValueDictionary = new RouteValueDictionary(routeValues);
                routeValueDictionary.Add("action", actionName);
                routeValueDictionary.Add("controller", controllerName);
                string virtualPath = this.RouteCollection.GetVirtualPath(this.RequestContext, routeValueDictionary).VirtualPath;
                //如果没有显示指定传输协议,和主机名称,则返回相对路径
                if (string.IsNullOrEmpty(protocol) && string.IsNullOrEmpty(hostName))
                {
                    return virtualPath.ToLower();
                }
                //假如没有显示指定协议,则默认为http
                protocol = protocol ?? "http";
                //假如没有指定主机名称,则默认使用当前请求的主机名称并使用当前的端口
                Uri uri = this.RequestContext.HttpContext.Request.Url;
                hostName = hostName ?? uri.Host + ":" + uri.Port;
                return string.Format("{0}://{1}{2}", protocol, hostName, virtualPath).ToLower();
            }

    在UrlHelper类里面我们可以看到还有一个很重要的方法,RouteUrl()。UrlHelper的Action方法和HtmlHelper的ActionLink方法的URL都是通过路由表的RouteCollection对象生成出来的,默认情况下就是全局路由表。但有时候我们是需要针对匹配的Route对象来生成URL或者链接,这时就要用到RouteUrl了。在HtmlHelper里这个方法叫RouteLink。没有显示指定Route注册名称时,RouteUrl会利用整个全局路由表;如果显示指定了Route的注册名称,则会查找对应的Route对象;如果不匹配则返回null。

9.动态HttpHandler映射

   在ASP.NET机制中,一般情况下一个请求最终是通过一个HttpHandler来处理的,表示一个Web页面的Page对象就是一个HttpHandler,它最终用于处理某个.aspx的请求。我们也可以通过HttpHandler的动态映射来实现请求地址与物理地址的分离。ASP.NET机制可以理解为请求Request到达,HttpModule进行拦截,同时生成HttpHandler对象,它将接管对当前请求的处理并最终发送请求Response。我们可以看下实现了IHttpModule接口的类

        public class UrlRoutingModule : IHttpModule
        {
            //默认情况下该属性是对RouteTable的静态属性Routes的引用
            public RouteCollection RouteCollection { get; set; }
            protected virtual void Init(HttpApplication application)
            {
                application.PostResolveRequestCache += new EventHandler(this.OnApplicationPostResolveRequestCache);
            }
            //HttpHandler的动态映射就实现在下面方法中,执行时会利用HttpApplication得到HttpContext对象,然后创建HttpContextWrapper对象
            //接下来UrlRoutingModule将这个对象作为参数调用RouteCollection对象的GetRouteData方法对当前实施路由解析,如果返回一个具体的RouteData对象
            //那么它会通过RouteHandler属性得到对应Route采用的RouteHandler,最后在RouteHandler调用GetHttpHandler得到需要被动态映射的HttpHandler对象
            private void OnApplicationPostResolveRequestCache(object sender, EventArgs e);
        }

    对于一个ASP.NET MVC应用来说,Route对象是通过调用RouteCollection的扩展方法MapRoute进行注册的,它的RouteHandler属性返回一个MvcRouteHandler对象,整个MVC框架就实现在这个MvcHandler中。书上最后还进行了一个定制路由的总结,我感觉我还是没有理解得很透彻:

      1通过继承抽象类RouteBase创建自定义Route类型定制路由。

      2通过实现接口IRouteHandler创建自定义RouteHandler定制HttpHandler提供机制。

      3通过实现IHttpHandler创建自定义HttpHandler来对请求进行处理并作最终的响应。

 

asp.net 路由学习四

标签:

原文地址:http://www.cnblogs.com/fangyz/p/4684179.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!