Многоязычные URL в ASP.NET MVC 3 - избегайте использования языка по умолчанию в многоязычных URL. - PullRequest
2 голосов
/ 03 марта 2012

Я хочу создать многоязычные URL-адреса для моего проекта ASP.NET MVC 3.

Язык не по умолчанию должен передаваться в URL-адресе в качестве первого параметра с использованием маршрутизации.Например, / es / blog / some-blog-post-slug

Английский будет использоваться в качестве языка по умолчанию и не должен указывать язык в URL.Как / blog / some-blog-post

Я пытался сделать это с маршрутизацией, но либо с разрывом маршрутизации, либо с генерацией 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

Это почти то, что мне нужно

Но когда я открываю тестовое представление с "http://localhost:19038/es/test/details/my-blog-post-one" 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" в параметрах контроллера по умолчанию - это не помогло.

Я мог бы добавить язык ко всем URL-адресам, но я хочу, чтобы URL-адреса были по умолчанию ("en")язык, чтобы пропустить язык в URL, и если даже кто-то передает «en» - перенаправить на URL без языка, и когда URL генерируется для «en» URL не должен включать его.

Что является правильнымспособ сделать такую ​​вещь?

Спасибо.

Ответы [ 2 ]

1 голос
/ 03 марта 2012

При посещении /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" })

Затем он отображает ожидаемое вами значение, используя альтернативный маршрут с отсутствующим lang, что приводит к:

/Test/Details/some-blog-post-slug
0 голосов
/ 06 марта 2012

Что вам может понадобиться, это атрибут Localization. Смотрите этот пост для деталей:

geekswithblogs.net / shaunxu / архив / 2010/05/06 / локализация-в-asp.net-MVC-Ndash-3-дней-расследование-1-day.aspx

...