DD4T默认路由不起作用

时间:2012-10-31 12:40:17

标签: asp.net-mvc-4 tridion tridion-2011 dd4t

我正在使用带有SDL Tridion 2011和ASP.NET MVC4的DD4T框架

我想要使用一些非DD4T控制器和视图,但是当我尝试访问这些网址时遇到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配置)

5 个答案:

答案 0 :(得分:7)

AFAICS有几个选项:

  1. 如果您可以从“普通”网址(扩展名,启动路径等)识别Tridion网址,则可以通过调整TridionPage路由来解决它。但是我认为这不是你的选择,因为如果你能从正常人那里认出Tridion网址,你就已经想出了这个解决方案;)

  2. 在TridionPage路由上实现路由约束。如果请求的URL在Broker中,请检查此routeconstraint。如果为true:返回true,否则返回false。如果返回false,则下一个匹配的路由将处理该请求。 虽然不确定性能。

  3. 您自己的选择:普通网页的特定路线。

  4. 我确信我错过了一些选择。希望其他人在这里分享他们。

答案 1 :(得分:6)

正常DD4T操作是让Tridion拥有URL,即捕获所有URL并将它们传递给一个PageController。这会干扰控制器/操作根据其名称自动路由,因此必须给出其中一个细节!

我个人喜欢阿尔伯特的第一个建议,因为它很简单。例如。仅将以“.html”结尾的网址映射到Tridion。不幸的是,这会导致SG中的默认页面出现问题,因为“/ sg”无法识别,即使您在代理中可能有“/sg/index.html”。一些替代方案可以解决这个问题:

  • 为所有第一级结构组(/ news,/ products等)配置显式路由

  • 将所有Tridion页面发布到您网站的子部分,例如/ content并将其映射到特定路线

答案 2 :(得分:3)

我们刚刚在根目录中放置了一个页面se_blank.html,并确保它仅部署到分段,因此它就在需要的地方,并且不需要特定的路径。

当然,这并不能真正回答你的问题,但你可以将其视为一种选择。

答案 3 :(得分:3)

也许您可以捕获所有映射,例如TridionPage映射到Controller,该控制器根据RedirectToAction函数的参数重定向到正确的控制器和操作?

不确定这是否适合您。

答案 4 :(得分:0)

我们的解决方案:Tridion不允许在link =>内创建包含'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}
);