Asp.net 如何在ASP MVC网站中使用路由以两种语言进行本地化-但保留现有URL
我们有两个ASP MVC网站,只使用标准VS模板默认设置-按需工作。但现在我想本地化这些网站,他们现在在荷兰语,我会添加英语 我想使用路由而不是资源,因为: 1.语言在内容、页数等方面会有所不同。 2.内容主要是文本 我希望URL看起来像这样-www.domain.com/en/Home/Index,www.domain.nl/nl/Home/Index。 但是最后一个也应该与-www.domain.nl/Home/Index一起使用,这就是令人兴奋的URL 我在这篇博客文章中实现了Phil Haacks areas ViewEngine-。但是只把英语网站放在这些地区,让荷兰人保持原有的结构。巫师是费城人的默认后备力量。 但问题是,我必须为这两种语言复制控制器 因此,我尝试了本文描述的工作方法-。它可以和?嗯?和/nl/但不使用旧URL 在global.asax中使用此代码时,不带区域性的URL不起作用Asp.net 如何在ASP MVC网站中使用路由以两种语言进行本地化-但保留现有URL,asp.net,localization,asp.net-mvc-routing,Asp.net,Localization,Asp.net Mvc Routing,我们有两个ASP MVC网站,只使用标准VS模板默认设置-按需工作。但现在我想本地化这些网站,他们现在在荷兰语,我会添加英语 我想使用路由而不是资源,因为: 1.语言在内容、页数等方面会有所不同。 2.内容主要是文本 我希望URL看起来像这样-www.domain.com/en/Home/Index,www.domain.nl/nl/Home/Index。 但是最后一个也应该与-www.domain.nl/Home/Index一起使用,这就是令人兴奋的URL 我在这篇博客文章中实现了Phil H
public static void RegisterRoutes(RouteCollection routes)
{
//routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{culture}/{controller}/{action}/{id}", // URL with parameters
new { culture = "nl-NL", controller = "Home", action = "Index", id = "" } // Parameter defaults
);
routes.MapRoute(
"DefaultWitoutCulture", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
我忽略了一些简单的事情,但我不能让它为我工作。还是有更好的方法 要使url不带区域性,我可能会创建自己的route类实现。可能看起来像这样:
public class LocalizedRoute : Route
{
//Constuctors
public override RouteData GetRouteData(HttpContextBase httpContext)
{
var routeData = base.GetRouteData(httpContext);
var culture = "en";
if (httpContext.Request.Url.ToString().Contains(".nl"))
culture = "nl";
routeData.Values.Add("culture", culture);
return routeData;
}
}
然后,当您注册路线时,您可以使用类似的方法:
var route = new LocalizedRoute("{controller}/{action}/{id}", new MvcRouteHandler()) {
Defaults = new RouteValueDictionary(new { controller = "Home", action = "Index", id = "" }),
Constraints = new RouteValueDictionary(),
DataTokens = new RouteValueDictionary()
};
routes.Add("DefaultWitoutCulture", route);
当然,这段代码可以稍微清理一下。但这是我如何解决您的问题的一个基本示例。要使url不带区域性,我可能会创建自己的route类实现。可能看起来像这样:
public class LocalizedRoute : Route
{
//Constuctors
public override RouteData GetRouteData(HttpContextBase httpContext)
{
var routeData = base.GetRouteData(httpContext);
var culture = "en";
if (httpContext.Request.Url.ToString().Contains(".nl"))
culture = "nl";
routeData.Values.Add("culture", culture);
return routeData;
}
}
然后,当您注册路线时,您可以使用类似的方法:
var route = new LocalizedRoute("{controller}/{action}/{id}", new MvcRouteHandler()) {
Defaults = new RouteValueDictionary(new { controller = "Home", action = "Index", id = "" }),
Constraints = new RouteValueDictionary(),
DataTokens = new RouteValueDictionary()
};
routes.Add("DefaultWitoutCulture", route);
当然,这段代码可以稍微清理一下。但这是我如何解决您问题的一个基本示例。谢谢Mattias
经过一些尝试和错误后,我提出了这个解决方案,它可以本地化为英语和荷兰语,但由于受到限制,必须对旧URL进行重要的处理
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{culture}/{controller}/{action}/{id}", // URL with parameters
new { culture = "nl", controller = "Home", action = "Index", id = "" },
new { culture = @"\Aen|nl\z" } // Parameter defaults
);
routes.MapRoute(
"DefaultWitoutCulture", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { culture = "nl", controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
谢谢你,马蒂亚斯
经过一些尝试和错误后,我提出了这个解决方案,它可以本地化为英语和荷兰语,但由于受到限制,必须对旧URL进行重要的处理
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{culture}/{controller}/{action}/{id}", // URL with parameters
new { culture = "nl", controller = "Home", action = "Index", id = "" },
new { culture = @"\Aen|nl\z" } // Parameter defaults
);
routes.MapRoute(
"DefaultWitoutCulture", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { culture = "nl", controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}