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. 如果您可以从“普通”网址(扩展名、启动路径等)中识别出 Tridion 网址,则可以通过调整 TridionPage 路由来解决它。但我认为这对你来说是没有选择的,因为如果你能从普通的 URL 中识别出 Tridion url,你已经想出了这个解决方案;)

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

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

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

于 2012-10-31T14:02:55.797 回答
6

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

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

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

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

于 2012-10-31T14:27:46.430 回答
3

我们只是在根目录中放置了一个页面 se_blank.html,并确保它只部署到登台,因此它在需要的地方并且不需要特定的路由。

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

于 2012-10-31T13:26:50.867 回答
3

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

不确定这是否是您的理想解决方案。

于 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 回答