2012-03-02 77 views
2

我想为ASP.NET MVC 3项目创建多语言URL。ASP.NET MVC 3中的多语言URL - 避免多语言URL中的默认语言代码

非默认语言应作为使用路由的第一个参数在URL中传递。 Like/es/blog/some-blog-post-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/test/details/my-blog-post-one" URL测试视图我在浏览器中看到:

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

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

这是相当我需要的很多

但是当我从打开测试视图URL我看到产生不同的URL:

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

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

当我打开"http://localhost:19038/en/test/details/my-blog-post-one"我得到:

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

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

而且"http://localhost:19038/xx/test/details/my-blog-post-one"生产:

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

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

为什么 “XX” 追加?我不会将语言传递给Razor HTML URL助手。 我也尝试在控制器的默认参数中使用lang =“en” - 它没有帮助。

我最终可能会将语言添加到所有网址,但是我希望带有默认(“en”)语言的网址在网址中省略该语言,并且即使有人传递了“en” - 也不会重定向到该网址语言, ,并且为“en”URL生成URL时不应包含它。

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

谢谢。

回答

1

当您访问/xx/Test/Details/some-blog-post-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" }) 

然后,通过使用替代路线导致:

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

我使用这种方式现在。还没有找到更好的。 – Zelid 2012-03-21 14:47:21