我正在使用带有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配置)
答案 0 :(得分:7)
AFAICS有几个选项:
如果您可以从“普通”网址(扩展名,启动路径等)识别Tridion网址,则可以通过调整TridionPage路由来解决它。但是我认为这不是你的选择,因为如果你能从正常人那里认出Tridion网址,你就已经想出了这个解决方案;)
在TridionPage路由上实现路由约束。如果请求的URL在Broker中,请检查此routeconstraint。如果为true:返回true,否则返回false。如果返回false,则下一个匹配的路由将处理该请求。 虽然不确定性能。
您自己的选择:普通网页的特定路线。
我确信我错过了一些选择。希望其他人在这里分享他们。
答案 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}
);