Asp.net mvc ASP.NET MVC 3中的多语言URL-避免多语言URL中的默认语言代码

Asp.net mvc ASP.NET MVC 3中的多语言URL-避免多语言URL中的默认语言代码,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc Routing,我想为我的ASP.NET MVC 3项目创建多语言URL 应使用路由将非默认语言作为第一个参数传递到URL中。比如/es/blog/一些博客帖子slug 英语将用作默认语言,并且不要求在URL中传递该语言。喜欢/博客/一些博客文章 我试着用路由做这件事,但不是路由中断就是URL生成 我尝试了许多路由选择,自定义路由。 目前我有: routes.MapRoute( "", // Route name "{lang}/{controller}/{action}/{slug}", // URL wit

我想为我的ASP.NET MVC 3项目创建多语言URL

应使用路由将非默认语言作为第一个参数传递到URL中。比如/es/blog/一些博客帖子slug

英语将用作默认语言,并且不要求在URL中传递该语言。喜欢/博客/一些博客文章

我试着用路由做这件事,但不是路由中断就是URL生成

我尝试了许多路由选择,自定义路由。 目前我有:

routes.MapRoute(
"", // Route name
"{lang}/{controller}/{action}/{slug}", // URL with parameters
new { controller = "Test", action = "Index", slug = UrlParameter.Optional }, // Parameter defaults
new { lang = "^[a-z]{2}$" }
);

routes.MapRoute(
"", // Route name
"{controller}/{action}/{slug}", // URL with parameters
new { controller = "Test", action = "Index", slug = UrlParameter.Optional } // Parameter defaults
);
在我的测试视图中,我有:

@Url.RouteUrl(new { controller = "Test", action = "Details", slug = "some-blog-post-slug" })
<br />
@Url.RouteUrl(new { lang = "es", controller = "Test", action = "Details", slug = "some-blog-post-slug" })
这正是我所需要的

但是当我从
打开测试视图时http://localhost:19038/es/test/details/my-博客帖子一“
URL我看到不同的URL生成:

/es/Test/Details/some-blog-post-slug 

/es/Test/Details/some-blog-post-slug
当我打开
”时http://localhost:19038/en/test/details/my-博客帖子一“
我得到:

/en/Test/Details/some-blog-post-slug 

/es/Test/Details/some-blog-post-slug
”http://localhost:19038/xx/test/details/my-博客帖子一“
产生:

/xx/Test/Details/some-blog-post-slug 

/es/Test/Details/some-blog-post-slug
为什么附加“xx”?我不会将语言传递给Razor HTML URL帮助程序。 我还尝试在控制器的默认参数中使用lang=“en”-这没有帮助

我可以最终将语言添加到所有URL,但我希望使用默认(“en”)语言的URL忽略URL中的语言,如果有人通过“en”-重定向到没有语言的URL, 当为“en”生成URL时,URL不应包含它

做这种事的正确方法是什么


谢谢。

当您访问
/xx/Test/Details/一些博客文章时,slug
ASP.NET MVC 3将
{lang}
xx
添加到路由数据中,当您调用:

@Url.RouteUrl(new { controller = "Test", action = "Details", slug = "some-blog-post-slug" })
如果您指定

@Url.RouteUrl(new { lang = (string)null, controller = "Test", action = "Details", slug = "some-blog-post-slug" })
然后,它通过使用带有缺少的
lang
的备用路由来呈现您期望的值,结果是:

/Test/Details/some-blog-post-slug

您可能需要的是本地化属性。有关详细信息,请参阅此帖子:


我现在正在使用这种方法。还没找到更好的。
/Test/Details/some-blog-post-slug