2

誰かが次の機能が何をするのか説明してもらえますか?Asp.net MVCを学習していますが、どのコントローラーがいつ呼び出され、どのビューをレンダリングするかを理解できません。

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        //register custom routes (plugins, etc)
        var routePublisher = EngineContext.Current.Resolve<IRoutePublisher>();
        routePublisher.RegisterRoutes(routes);

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { "Nop.Web.Controllers" }
        );
    }

このコードはnopCommerceのソースコードからのものです。このプロジェクトのURLルーティングがわかりません

4

2 に答える 2

2

nopCommerceは、各プラグインのルートを個別に登録する疎結合インフラストラクチャを採用しています。

したがって、何が起こっているのかを理解する必要がある場合は、nopCommerceソースコードを確認し、各プラグインにあるRouteProviderクラスを探してください。これらは、アプリケーションの起動時に動的にロードされます。

独自のルートを作成する必要がある場合でも、従来の方法で作成できますが、衝突が発生する可能性があることに注意してください。

(免責事項:私はソースコードを見ただけで、それについて他に何も知りません)。

于 2011-11-13T11:37:26.483 に答える
2

このためのロジックは、System.Web.Mvc.MvcHandlerクラス、System.Web.Mvc.DefaultControllerFactoryクラス、およびSystem.Web.Mvc.ControllerActionInvokerクラスにあります。 .NETReflectorはあなたの友達です。

基本的に、MVCフレームワークは次のとおりです。

  1. リフレクションを使用して、アプリケーションプロジェクト内のすべてのコントローラーを取得します。

  2. 次に、のようなことをしますIEnumerable<string> controllerNames = controllerTypes.Select(controllerType => controllerType.Name.Replace("Controller",string.Empty));。次に、最初のパスセグメント、{controller}をこれらのサニタイズされたコントローラータイプ名の1つに一致させようとします(大文字と小文字は区別されません)。

  3. ActionResult次に、タイプまたは派生物の戻り型を持つこのコントローラーのパブリックメソッドを調べます。{action}呼び出されるアクションメソッドとして、 メソッド名を2番目のパスセグメントに一致させます。

  4. 選択したメソッドに、という名前のパラメーターがある場合id、3番目のパスセグメント{id}をその値に一致させ、それをメソッドに渡します。それ以外の場合、オプションのidパラメーターは無視されます。

  5. ActionResult返されるタイプがの派生物である場合ViewResultBaseIViewEngineそのビューエンジンに指定されている規則を使用して、プロジェクト内の対応するビューを見つけようとします。WebFormViewEngineたとえば、は、プロジェクトでデフォルトで ~/Views/{controller}/{action}.ascx、、 ~/Views/{controller}/{action}.aspxを 検索します。~/Views/Shared/{action}.ascx~/Views/Shared/{action}.aspx

于 2011-11-13T11:47:56.077 に答える