自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

實(shí)戰(zhàn)ASP.NET MVC幫助理解Routing

開發(fā) 后端
ASP.NET MVC的了解,讓我們從Routing開始,站在應(yīng)用的角度上看,這絕對是個非常簡單的,因?yàn)閼?yīng)用程序中只需要寥寥幾行代碼就可以了!所以讓我們從本質(zhì)的角度上去了解,認(rèn)清它的工作機(jī)制。

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

從簡單開始吧:

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

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

當(dāng)編寫完這些后,應(yīng)用就結(jié)束了,但是從本質(zhì)上只是一個開始,在此我產(chǎn)生了三個問題:

1、路由的集合中都是些什么數(shù)據(jù)?

 

這里最重要的是Route對象,因?yàn)槲覀冊O(shè)置的數(shù)據(jù)都是作為該對象的屬性,例如:上面的Routename、URL...,然而它的作用就是根據(jù)這些屬性和請求路徑去構(gòu)造RouteData對象。

構(gòu)造Route對象的方式有兩種:

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

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

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

 

IgnoreRoute方法構(gòu)造StopRoutingHandler作為參數(shù),而MapRoute方法構(gòu)造MvcRouteHandler作為參數(shù).而這兩個IRouteHandler之間的區(qū)別通過下面的代碼就清晰的看到,

//MvcRoutingHandler的實(shí)現(xiàn)
protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext)
{
    return new MvcHandler(requestContext);
}

//StopRoutingHandler的實(shí)現(xiàn)
protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext)
{
    throw new NotSupportedException();
}

在構(gòu)造完Route對象后,對于它的利用主要就是GetRouteData方法,即根據(jù)HttpContextBase參數(shù)(下面闡述)和Route對象中的屬性來構(gòu)造并獲取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、路由數(shù)據(jù)在整個WEB生命周期中扮演著什么角色?

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

 

然后,我們再去看下UrlRoutingModule這個類,該類就是擴(kuò)展了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);
}

在這兩個事件執(zhí)行的時候都會去構(gòu)建HttpContextBase對象,然后作為參數(shù)傳入后面的方法.在處理IHttpHandler之前是執(zhí)行PostResolveRequestCache方法.該方法通過GetRouteData獲取RouteData,并通過RouteData的RouteHandler獲取IRouteHandler,如果是StopRoutingHandler就執(zhí)行完成,如果不是,則將執(zhí)行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");
        }
    }
}

執(zhí)行完成IHttpHandler后,就要執(zhí)行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之間在哪里做檢測的,如何檢測?  

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

1、設(shè)置Route對象的Url,如下圖,在設(shè)置Url的動作中作了如下動作,并將輸出的ParseRoute對象設(shè)置到Route對象中的內(nèi)部屬性_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),即根據(jù)請求的Url來和設(shè)定的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服務(wù)開發(fā)實(shí)例
  3. 亮劍.NET:ASP.NET商業(yè)級數(shù)據(jù)庫網(wǎng)站開發(fā)實(shí)戰(zhàn)
責(zé)任編輯:彭凡 來源: cnblogs
相關(guān)推薦

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基礎(chǔ)開發(fā)

2009-07-31 12:43:59

ASP.NET MVC

2009-07-24 13:20:44

MVC框架ASP.NET

2009-07-23 15:44:39

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-20 10:53:59

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

2009-07-29 09:17:12

jQuery刪除

2009-07-23 11:33:18

2009-07-22 10:13:31

異步ActionASP.NET MVC

2009-07-20 15:44:32

ASP.NET MVC

2009-07-22 09:11:02

Action方法ASP.NET MVC
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號