Я искал решение для интернационализации / локализации маршрутов на веб-сайте ASP.NET MVC. Я наткнулся на сообщение в блоге Перевод маршрутов (ASP.NET MVC и Webforms) от Мартена Баллиау. Он представляет очень хорошее решение, которое прекрасно работает - пока в поле зрения не будет Html.RenderAction("...")
.
В основном он вводит TranslatedRoute
наследование от System.Web.Routing.Route
, что делает перевод с использованием словаря с переводами на лету.
Есть идеи, почему при вызове Html.RenderAction("...")
все происходит иначе? Также кажется, что ошибка возникает только в том случае, если действие, которое должно быть выполнено, выполняется в том же контроллере.
А вот точная ошибка:
"Контроллер для пути '/ MyTranslatedControllerName' не найден или не реализует IController."
Обновление:
Вот моя конфигурация маршрутов (взятая из примера проекта Maarten, добавлены маршруты для Contact, который является частичной визуализацией):
public static void RegisterRoutes(RouteCollection routes)
{
CultureInfo cultureEN = CultureInfo.GetCultureInfo("en-US");
CultureInfo cultureDE = CultureInfo.GetCultureInfo("de-DE");
CultureInfo cultureFR = CultureInfo.GetCultureInfo("fr-FR");
DictionaryRouteValueTranslationProvider translationProvider = new DictionaryRouteValueTranslationProvider(
new List<RouteValueTranslation> {
new RouteValueTranslation(cultureEN, "Home", "Home"),
new RouteValueTranslation(cultureEN, "About", "About"),
new RouteValueTranslation(cultureEN, "Contact", "Contact"),
new RouteValueTranslation(cultureDE, "Home", "Home"),
new RouteValueTranslation(cultureDE, "About", "About"),
new RouteValueTranslation(cultureDE, "Contact", "Kontakt"),
new RouteValueTranslation(cultureFR, "Home", "Demarrer"),
new RouteValueTranslation(cultureFR, "About", "Infos"),
new RouteValueTranslation(cultureFR, "Contact", "Contact")
}
);
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapTranslatedRoute(
"TranslatedRoute",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" },
new { controller = translationProvider, action = translationProvider },
true
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);