Asp.net mvc ASP.NET MVC 3中的多语言URL-避免多语言URL中的默认语言代码
我想为我的ASP.NET MVC 3项目创建多语言URL 应使用路由将非默认语言作为第一个参数传递到URL中。比如/es/blog/一些博客帖子slug 英语将用作默认语言,并且不要求在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
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