DD4T Маршрут по умолчанию не работает
Я использую инфраструктуру DD4T с SDL Tridion 2011 и ASP.NET MVC4
У меня есть некоторые не-DD4T контроллеры и представления, которые я хочу использовать, однако я получаю ошибку 404, когда пытаюсь перейти к этим URL-адресам.
Это моя таблица маршрутов
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, но затем я получил 404 для страниц Tridion.
Кажется, что единственный способ заставить его работать, это иметь определенный маршрут к моему контроллеру, например:
routes.MapRoute(
null, // Route name
"MyController/{action}/{id}", // URL with parameters
new { controller = "MyController", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
У кого-нибудь есть идеи? Как указано выше решение не является идеальным.
(У меня нет конфигурации UI 2012 в моем web.config)
5 ответов
Есть несколько вариантов AFAICS:
Если вы можете распознать URL-адрес Tridion по "обычному" URL-адресу (добавочный номер, начальный путь и т. Д.), Вы можете решить его, настроив маршрут TridionPage. Но я думаю, что это не вариант для вас, потому что, если вы сможете узнать URL-адрес Тридиона по обычному, вы уже нашли бы такое решение;)
Реализуйте ограничение маршрута на маршруте TridionPage. Проверьте в этом ограничении маршрута, если запрошенный URL находится в Брокере. Если true: вернуть true, иначе false. Если он возвращает false, следующий маршрут (соответствующий) обработает запрос. Не уверен насчет производительности, хотя.
Ваш собственный вариант: конкретный маршрут для ваших обычных страниц.
Я уверен, что я пропустил некоторые варианты. Надеюсь, кто-то еще поделится ими здесь.
Обычная операция DD4T - позволить Tridion владеть URL-адресами, то есть перехватывать все URL-адреса и передавать их одному PageController. Это мешает автоматической маршрутизации контроллеров / действий, основанных на их именах, поэтому один из этих тонкостей должен дать!
Мне лично нравится первое предложение Альберта, потому что оно простое. Например, сопоставьте только URL-адреса, заканчивающиеся на ".html", с Tridion. К сожалению, это вызывает проблему со страницами по умолчанию в SG, так как "/sg" не распознается, даже если у вас есть "/sg/index.html" в посреднике. Некоторые альтернативы, чтобы обойти это:
Настройте явные маршруты для всех ваших структурных групп первого уровня (/news, /products и т. Д.)
Опубликуйте все страницы Tridion в подразделе вашего сайта, например, /content и сопоставьте его с определенным маршрутом.
Мы просто поместили страницу se_blank.html в корень и убедились, что она была развернута только в стадии подготовки, чтобы она была там, где это необходимо, и не требовала определенного маршрута.
Это на самом деле не отвечает на ваш вопрос, конечно, но вы можете рассмотреть его как вариант.
Возможно, вы могли бы сделать перехват всех сопоставлений, таких как сопоставление TridionPage с контроллером, который перенаправляет на правильный контроллер и действие на основе параметров с функцией RedirectToAction?
Не уверен, что это идеальное решение для вас.
Наше решение: Tridion не позволяет создавать страницы с mvc внутри ссылки => мы определили ограничение, которое игнорирует PageId с mvc в RouteConfig.
Итак: когда DD4T получает запрос на страницу "tridion", он использует маршрут TridionPage, а когда это запрос / контроллер / действие, он использует маршрут 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}
);