成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

實戰ASP.NET MVC幫助理解Routing

開發 后端
ASP.NET MVC的了解,讓我們從Routing開始,站在應用的角度上看,這絕對是個非常簡單的,因為應用程序中只需要寥寥幾行代碼就可以了!所以讓我們從本質的角度上去了解,認清它的工作機制。

ASP.NET MVC的了解,讓我們從Routing開始,站在應用的角度上看,這絕對是個非常簡單的,因為應用程序中只需要寥寥幾行代碼就可以了!所以讓我們從本質的角度上去了解,認清它的工作機制。

從簡單開始吧:

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);
}

應用程序啟動的時候,將自定義的路由信息加到RouteTable的路由集合中。

當編寫完這些后,應用就結束了,但是從本質上只是一個開始,在此我產生了三個問題:

1、路由的集合中都是些什么數據?

 

這里最重要的是Route對象,因為我們設置的數據都是作為該對象的屬性,例如:上面的Routename、URL...,然而它的作用就是根據這些屬性和請求路徑去構造RouteData對象。

構造Route對象的方式有兩種:

1、new Route(...),構造該對象,并使用RouteTable.Routes.Add(routeObj)來加入集合。

2、RouteCollectionExtensions.IgnoreRoute或MapRoute方式來構造Route對象,并加入集合。

大家可以注意到了,IgnoreRoute和MapRoute這兩個擴展方法,有什么不同呢?!先看下Route的構造函數,構造的時候會有一個必須的參數IRouteHandler:

 

IgnoreRoute方法構造StopRoutingHandler作為參數,而MapRoute方法構造MvcRouteHandler作為參數.而這兩個IRouteHandler之間的區別通過下面的代碼就清晰的看到,

//MvcRoutingHandler的實現
protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext)
{
    return new MvcHandler(requestContext);
}

//StopRoutingHandler的實現
protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext)
{
    throw new NotSupportedException();
}

在構造完Route對象后,對于它的利用主要就是GetRouteData方法,即根據HttpContextBase參數(下面闡述)和Route對象中的屬性來構造并獲取RouteData對象,

GetRouteData
public override RouteData GetRouteData(HttpContextBase httpContext)
{
    string virtualPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo;
    RouteValueDictionary values = this._parsedRoute.Match(virtualPath, this.Defaults);
    if (values == null)
    {
        return null;
    }
    RouteData data = new RouteData(this, this.RouteHandler);
    if (!this.ProcessConstraints(httpContext, values, RouteDirection.IncomingRequest))
    {
        return null;
    }
    foreach (KeyValuePair pair in values)
    {
        data.Values.Add(pair.Key, pair.Value);
    }
    if (this.DataTokens != null)
    {
        foreach (KeyValuePair pair2 in this.DataTokens)
        {
            data.DataTokens[pair2.Key] = pair2.Value;
        }
    }
    return data;
}

2、路由數據在整個WEB生命周期中扮演著什么角色?

清楚了集合中的數據,那么就解決第二個問題,先看下WEB的生命周期:

 

然后,我們再去看下UrlRoutingModule這個類,該類就是擴展了PostResolveRequestCache和PostMapRequestHandler事件,即對于Route的用途就在這兩個事件中.下面讓我們從源代碼上去了解該事件到底有什么.

Code
private void OnApplicationPostMapRequestHandler(object sender, EventArgs e)
{
    HttpContextBase context = new HttpContextWrapper(((HttpApplication) sender).Context);
    this.PostMapRequestHandler(context);
}

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

在這兩個事件執行的時候都會去構建HttpContextBase對象,然后作為參數傳入后面的方法.在處理IHttpHandler之前是執行PostResolveRequestCache方法.該方法通過GetRouteData獲取RouteData,并通過RouteData的RouteHandler獲取IRouteHandler,如果是StopRoutingHandler就執行完成,如果不是,則將執行UrlRoutingHandler.

PostResolveRequestCache
public virtual void PostResolveRequestCache(HttpContextBase context)
{
    RouteData routeData = this.RouteCollection.GetRouteData(context);
    if (routeData != null)
    {
        IRouteHandler routeHandler = routeData.RouteHandler;
        if (routeHandler == null)
        {
            throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, RoutingResources.UrlRoutingModule_NoRouteHandler, new object[0]));
        }
        if (!(routeHandler is StopRoutingHandler))
        {
            RequestContext requestContext = new RequestContext(context, routeData);
            IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);
            if (httpHandler == null)
            {
                throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, RoutingResources.UrlRoutingModule_NoHttpHandler, new object[] { routeHandler.GetType() }));
            }
            RequestData data2 = new RequestData();
            data2.OriginalPath = context.Request.Path;
            data2.HttpHandler = httpHandler;
            context.Items[_requestDataKey] = data2;
            context.RewritePath("~/UrlRouting.axd");
        }
    }
}

執行完成IHttpHandler后,就要執行PostMapRequestHandler方法,該方法做的事情很簡單,就是重寫下請求路徑,讓輸出的路徑和輸入的路徑相同,在這里用來記憶輸入路徑的是context.Items[],從上下兩段代碼中可以看到。

PostMapRequestHandler
public virtual void PostMapRequestHandler(HttpContextBase context)
{
    RequestData data = (RequestData) context.Items[_requestDataKey];
    if (data != null)
    {
        context.RewritePath(data.OriginalPath);
        context.Handler = data.HttpHandler;
    }
}

#p#

3、請求的Url和定制Routing中的Url之間在哪里做檢測的,如何檢測?  

我們只要了解兩個執行動作就可以了:

1、設置Route對象的Url,如下圖,在設置Url的動作中作了如下動作,并將輸出的ParseRoute對象設置到Route對象中的內部屬性_parsedRoute

Url
public string Url
{
    get
    {
        return (this._url ?? string.Empty);
    }
    set
    {
        this._parsedRoute = RouteParser.Parse(value);
        this._url = value;
    }
}

 

2、在PostResolveRequestCache方法中的RouteData routeData = this.RouteCollection.GetRouteData(context),即根據請求的Url來和設定的Routing作比較,并獲取RouteData,這里可以看上面的GetRouteData代碼,圖示如下:

 

OK,對于Routing的理解寫完了!

博文鏈接:http://www.cnblogs.com/Kevin-moon/archive/2009/03/10/1403118.html

【編輯推薦】

  1. ASP.NET Web Forms 4.0中雙向Routing支持
  2. 使用ASP.Net 3.5的Ajax與Web服務開發實例
  3. 亮劍.NET:ASP.NET商業級數據庫網站開發實戰
責任編輯:彭凡 來源: cnblogs
相關推薦

2014-08-26 09:22:40

ASP.NET MVCRouting

2009-08-19 09:23:40

ASP.NET Rou

2009-07-21 15:11:14

ASP.NET Rou

2015-06-18 14:13:36

ASP.NET

2009-04-20 09:43:37

ASP.NET MVC基礎開發

2009-07-24 13:20:44

MVC框架ASP.NET

2009-07-31 12:43:59

ASP.NET MVC

2009-07-20 10:53:59

ASP.NET MVC

2009-07-22 10:09:59

ASP.NET MVC

2009-07-23 14:31:20

ASP.NET MVC

2009-07-22 13:24:24

ASP.NET MVC

2009-07-23 15:44:39

ASP.NET MVC

2009-08-21 10:51:55

ASP.NET Rou解析URL

2009-07-31 18:37:45

ASP.NET MVC

2015-03-03 10:23:22

ASPASP.NETBootStrap

2010-06-23 15:44:03

ASP.NET MVC

2010-03-19 09:17:16

ASP.NET MVC

2009-07-24 11:33:12

MVC單元測試ASP.NET

2009-07-22 10:34:37

ActionInvokASP.NET MVC

2009-07-22 13:08:55

拯救UpdatePanASP.NET MVC
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美福利影院 | 一区免费 | 国产精品视频久久久 | 日本福利一区 | 黄色片免费在线观看 | 黄毛片| 国产日韩欧美一区 | 欧美午夜一区 | 久久日韩精品一区二区三区 | 在线色| 欧美一级欧美三级在线观看 | 天天干天天操天天射 | 久久综合一区二区 | 一级a性色生活片久久毛片 午夜精品在线观看 | 午夜精品一区二区三区在线播放 | 激情 婷婷| 国产成在线观看免费视频 | 日日天天 | 一级黄色片一级黄色片 | 欧美午夜精品 | 亚洲激情在线观看 | 欧美中国少妇xxx性高请视频 | 国外成人免费视频 | 亚洲国产精品久久久 | 国产一区在线免费 | 国产成人aⅴ | 精品99在线 | 91九色在线观看 | 亚洲天堂免费在线 | 久久久久久免费毛片精品 | www.青娱乐| 日本高清视频在线播放 | 久久日韩粉嫩一区二区三区 | 一级欧美视频 | 欧美精品一区二区在线观看 | 一级爱爱片 | 三级av网址 | 俺去俺来也www色官网cms | 日韩中文字幕在线不卡 | 欧美 日韩 视频 | 久久精品综合网 |