5

SDL Tridion 2011 および ASP.NET MVC4 で DD4T フレームワークを使用しています。

DD4T 以外のコントローラーとビューを使用したいのですが、これらの URL にアクセスしようとすると 404 エラーが発生します。

これは私のルートテーブルです

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

        // Route for SDL Tridion UI 2011 (Aka !SiteEdit)
        routes.MapRoute(
            "SiteEditBlankPage",
            "se_blank.html",
            new { controller = "Empty", action = "Index" });

        routes.MapRoute(
            null, // Route name
            "xml/{*PageId}", // URL with parameters
            new { controller = "Page", action = "Xml" }, // Parameter defaults
           new { pageId = @"^(.*)?$" } // Parameter constraints
        );

        // Tridion page route
        routes.MapRoute(
           "TridionPage",
           "{*PageId}",
           new { controller = "Page", action = "Page" }, // Parameter defaults
           new { pageId = @"^(.*)?$" } // Parameter constraints
        );

        routes.MapRoute(
            null, // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }

デフォルト ルートを Tridion の上に移動しようとしましたが、Tridion ページで 404 が発生します。

それを機能させる唯一の方法は、コントローラーへの特定のルートを設定することです。

        routes.MapRoute(
           null, // Route name
           "MyController/{action}/{id}", // URL with parameters
           new { controller = "MyController", action = "Index", id = UrlParameter.Optional } // Parameter defaults
       );

誰にもアイデアはありますか?上記のソリューションは理想的ではありません。

(web.config に UI 2012 構成がありません)

4

5 に答える 5

7

いくつかのオプションがあります AFAICS:

  1. 「通常の」URL (拡張子、開始パスなど) から Tridion の URL を認識できる場合は、TridionPage ルートを調整することで解決できます。しかし、これはあなたにとって選択肢ではないと思います.TridionのURLを通常のURLから認識できれば、すでにこの解決策を思いついているでしょう;)

  2. TridionPage ルートにルート制約を実装します。要求された URL が Broker にある場合は、この routeconstraint をチェックインしてください。true の場合: true を返し、それ以外の場合は false を返します。false が返された場合、(一致する) 次のルートがリクエストを処理します。ただし、パフォーマンスについてはわかりません。

  3. 独自のオプション: 通常のページの特定のルート。

私はいくつかのオプションを逃したと確信しています。うまくいけば、他の誰かがここでそれらを共有します。

于 2012-10-31T14:02:55.797 に答える
6

通常の DD4T 操作は、Tridion に URL を所有させることです。つまり、すべての URL をキャッチして、それらを 1 つの PageController に渡します。これは、名前に基づくコントローラー/アクションの自動ルーティングを妨げるため、これらの機能の 1 つを与える必要があります。

個人的には、Albert の最初の提案がシンプルで気に入っています。たとえば、'.html' で終わる URL のみを Tridion にマップします。残念ながら、ブローカに「/sg/index.html」がある場合でも、「/sg」が認識されないため、SG のデフォルト ページで問題が発生します。それを回避するためのいくつかの代替手段:

  • すべての第 1 レベル構造グループ (/news、/products など) の明示的なルートを構成します。

  • すべての Tridion ページをサイトのサブセクション (例: /content) に公開し、それを特定のルートにマップします

于 2012-10-31T14:27:46.430 に答える
3

ページ se_blank.html をルートに配置し、それがステージングにのみデプロイされるようにして、必要な場所にあり、特定のルートを必要としないようにしました。

もちろん、それはあなたの質問に本当に答えているわけではありませんが、おそらくオプションと考えることができます.

于 2012-10-31T13:26:50.867 に答える
3

おそらく、RedirectToAction 関数のパラメーターに基づいて正しいコントローラーとアクションにリダイレクトするコントローラーへの TridionPage マッピングのようなすべてのマッピングをキャッチすることができますか?

これがあなたにとって理想的なソリューションであるかどうかはわかりません。

于 2012-10-31T13:37:40.357 に答える
0

私たちの解決策: Tridion は、リンク内に「mvc」を含むページを作成することを許可していません => RouteConfig で「mvc」を含む PageId を無視する制約を定義しました。

つまり、DD4T が「tridion」ページのリクエストを受信すると、TridionPage ルートを使用し、リクエスト /Controller/Action の場合はデフォルトの MVC ルートを使用します。

routes.MapRoute(
"TridionPage",
"{PageId}",
new { controller = "Page", action = "Page" }, //parameter defaults
new { PageId = @"(?!mvc.)*" } // Parameter constraint: ignore PageId with '/'
);

//Default MVC route
routes.MapRoute(
"MVC", //Route name
"mvc/{controller}/{action}/{id}", 
new { controller = "Home", action = "Index", id = UrlParameter.Optional}
);
于 2013-10-03T08:16:42.817 に答える