Asp.net 如何在ASP MVC网站中使用路由以两种语言进行本地化-但保留现有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

我们有两个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不起作用

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
            );

        }