MVCにおけるURLルーティング(一)

14952 ワード

URLルーティングシステムは,要求アドレスを解析することにより,ターゲットコントローラ名を中心としたルーティングデータを得る.Urlルーティングシステムは、当初、要求urlと物理ファイルパスの分離を実現するために構築され、MVCのUrl Routeは、Urlアドレスと物理ファイルマッピングをターゲットControllerに移行したマッピングである.
UrlルーティングはASPではない.NET MVC特有の、ASP.NET上の、MVCはこのルートの拡張のみ使用(asp.netもこの拡張を使用し始めた).
 
App_StartフォルダにRouteConfigが見つかりました.csのファイル、開けてみます
 1         public static void RegisterRoutes(RouteCollection routes)

 2         {

 3             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

 4 

 5             routes.MapRoute(

 6                 name: "Default",

 7                 url: "{controller}/{action}/{id}",

 8                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }

 9             );

10         }

urlのアドレスの1つ目はcontrollerで、2つ目はactionで、3つ目はパラメータidで、defaultsはデフォルトのパラメータで、Globalです.asaxは、このルーティングを登録します.
  
1         protected void Application_Start()

2         {

3             AreaRegistration.RegisterAllAreas();

4             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

5             RouteConfig.RegisterRoutes(RouteTable.Routes);

6             BundleConfig.RegisterBundles(BundleTable.Bundles);

7         }

 
  
簡単にルーティングのタスク:リクエストのURLをチェックし、現在リクエストされているコントロールのどのactionが、どのパラメータを持ってきたかを特定します.
 
では、アドレスを要求したとき、ルーティングシステムで何があったのか分析してみましょう.まず大胆に当ててみましょう:ネットワークデバイスのルータに似ていて、それは1つのルーティングテーブルがあって、私达の配置の规则によってポートから来たデータに対して転送を行って、このテーブルの中でマッチングの规则と処理のプログラムを记录して、1つのパケットが来た时、このテーブルの中に行って相応の送信アドレスを探して、见つけたらルーティングシステムはこのパケットをどの対応するアドレスの中に送ります.
 
上の論理に従って、私たちはまず一致する規則がどこに追加されたのかを探して、私たちは上の静的な方法の中でRouteCollectionのものを見て、中に入って何があるかを見てみましょう.
  
MapPageRouteの方法を見つけました
  
 1         //

 2         //   : 

 3         //            Web             。

 4         //

 5         //   : 

 6         //   routeName:

 7         // 8         //

 9         //   routeUrl:

10         //         URL   。

11         //

12         //   physicalFile:

13         //           URL。

14         //

15         //     : 

16         //

17         public Route MapPageRoute(string routeName, string routeUrl, string physicalFile);

 
  
RouteCollectionを呼び出すMapPageRouteメソッドは、指定されたurlテンプレートに基づいてルーティングオブジェクトを作成し、このグローバルルーティングテーブルに追加する物理ファイルパスをURLテンプレートにマッピングします.プログラムはどこにAddのエントリがありますか?うっかりRouteCollectionでAddの方法を見つけました
 
  
 1         //   : 

 2         //            System.Web.Routing.RouteCollection      ,           。

 3         //

 4         //   : 

 5         //   name:

 6         //           。      null      。

 7         //

 8         //   item:

 9         //10         //

11         //   : 

12         //   System.ArgumentNullException:

13         //     item   null。

14         //

15         //   System.ArgumentException:

16         //     name        。

17         public void Add(string name, RouteBase item);

 
  
ここにRoutebaseが追加されているのが見えますが、クリックして何が始まったのか見てみましょう.
 
  
 1     //   : 

 2     //          ASP.NET          。

 3     [TypeForwardedFrom("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")]

 4     public abstract class RouteBase

 5     {

 6         //   : 

 7         //                   。               。

 8         protected RouteBase();

 9 

10         //   : 

11         //             ,     ASP.NET                   URL。

12         //

13         //     : 

14         //        ASP.NET           (              ),   true;    false。      false。

15         public bool RouteExistingFiles { get; set; }

16 

17         //   : 

18         //              ,            。

19         //

20         //   : 

21         //   httpContext:

22         //         ,     HTTP      。

23         //

24         //     : 

25         //         ,        (            )  null(           )。

26         public abstract RouteData GetRouteData(HttpContextBase httpContext);

27         //

28         //   : 

29         //              ,             ,    ,      URL,            。

30         //

31         //   : 

32         //   requestContext:

33         //         ,             。

34         //

35         //   values:

36         //37         //

38         //     : 

39         //         (      URL         )  null(      values    )。

40         public abstract VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values);

41     }

 
GetRouteDataとGetVirtualPathの2つの抽象的な方法を見ました.1つのリクエストが来ると、URLテンプレートのパターンに基づいてリクエストアドレスを表すURLアドレスと一致し、一致に失敗してnullに戻り、成功すると、GetRouteDataはルーティング情報をカプセル化したRouteDataオブジェクトを得、GetVirtualPathはURLを生成します.このURLはVirtualPathDataオブジェクトとしてカプセル化されて返される.
 
以上の推測から,ルーティングシステムの物理ファイルパスがグローバルなルーティングテーブルに追加され,指定されたパラメータ呼び出し同名メソッドが指定された要求URLに一致するルーティングオブジェクトを見つけ,対応するRouteDataとVirtualPathDataオブジェクトを返すことが分かった.
 
はい、簡単なUrlはここに書きます.後で次のステップを詳しく説明しますので、楽しみにしてください.