MVC路由解析---UrlRoutingModule


文章引導

              MVC路由解析---IgnoreRoute 

              MVC路由解析---MapRoute 

              MVC路由解析---UrlRoutingModule  

              Area的使用

引言:

                此文全文內容90%轉自

一.前言

                在MVC中,一個請求對應一個Controller的Action,熟悉asp.net的人應該知道,asp.net請求實際交給了HttpHandler進行了處理,HttpHandler就是ASP.NET的處理器。MVC的Action,請求都會交給HttpHandler。具體是在管道事件中,會根據請求創建一個HttpHandler,執行HttpHandler的ProcessRequest方法。

二.UrlRoutingModule

                MVC的路由機制是通過一個UrlRoutingModule完成的,它是一個實現了IHttpModule的類,HttpModule通過注冊HttpApplication事件參與到管道處理請求中。具體是訂閱HttpApplication某個階段的事件。廢話不多說,上源碼

public class UrlRoutingModule:IHttpModule
{
    public RouteCollection _routeCollection;
  
    protected virtual void Init(HttpApplication application)
    {
         application.PostResolveRequestCache+=OnApplicationPostResolveRequestCache;
    }

    void OnApplicationPostResolveRequestCache(object sender,EventArgs e)
    {
          HttpApplication app=(HttpApplication)sender;
          HttpContextBase context=new HttpContextWrapper(app.Context);
          PostResolveRequestCache(context);
    }

    public virtual void PostResolveRequestCache(HttpContextBase context)
    {
          RouteData routeData=RouteCollection.GetRouteData(context);
          
          IRouteHandler routeHandler=routeData.RouteHandler;

          RequestContext requestContext=new RequestContext(context,routeData);
          context.Request.RequestContext=requestContext;
    
          IHttpHandler httpHandler=routeHandler.GetHttpHandler(requestContext);
          context.RemapHandler(httpHandler);
    }
}

                  我們看看UrlRoutingModule的路線圖               

                          

                Route.GetRouteData:

public override RouteData GetRouteData(HttpContextBase httpContext)
{
     //AppRelativeCurrentExecutionFilePath:獲取應用程序的虛擬路徑,並通過對應用程序根使用波形符(~)表示法,(例:~/page.aspx)使該路徑成為相對路徑。
     //HttpRequest.PathInfo:獲取擴展名的附加信息,例:對於 URL Http://www.contoso.com/virdir/page.html/tail,PathInfo 值為 /tail。
     string requestPath=httpContext.Request.AppRelativeCurrentExecutionFilePath.SubString(2)+httpContext.Request.PathInfo;
       
     RouteValueDictionary values=_parseRoute.Match(requestPath,Defaults);

     RouteData routeData=new RouteData(this,RouteHanlder);

     foreach(var item in values)
     {
          routeData.Values.Add(item.Key,value.Value);
     }

     //DataTokens
}

                 GetRouteData通過HttpContext來獲取路由信息,形成RouteData,將URL與Defaults的Key進行匹配,形成RouteValueDictionary ,我們看看RouteData內部信息

                                屬性:Route--->RouteData有參構造函數的參數Route

                                           RouteHandler--->RouteData有參構造函數的參數IRouteHandler

                                方法:GetRouteData---->return RouteData

                                           GetRequiredString---->string

                 上述的RouteHandler由Route的構造函數參數傳入,  這里的Route來自於

                   

                                              

 

 

                            

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM