2008-11-14 22 views
9

Podczas tworzenia wielojęzycznej strony internetowej (z wykorzystaniem formularzy internetowych ASP.NET) będę używał modułu HTTP do przepisywania adresów URL, aby otrzymać coś przyjaznego (dla ludzi: & wyszukiwanie silniki), takie jak:Wielojęzyczne witryny z ASP.NET MVC

uk/products/product_category_one/sub_category_one/index.aspx 
uk/products/product_category_one/sub_category_one/widget_mk5.aspx 
es/productos/categoría_de_producto_una/widget_mk5.aspx 

My (newbie) rozumienie MVC jest to, że adres URL powinien mieć format

Controller/Action/Identifier

więc replikować funkcjonalność powyżej MVC będzie skończyć z URL podobny do:

products/category/123/product_category_one/sub_category_one 
products/items/456/widget_mk5 

pytania ..

  • można wstawić kod kraju w adresie URL przed segmencie „administrator danych”?
  • Czy można mapować „produkty” i „Produktów” na tym samym kontrolerze?

Dzięki za pomoc

Edit: Oprócz odpowiedzi Panos' poniżej znalazłem więcej informacji na ASP.NET Website.

Odpowiedz

12

URL może mieć prawie każdą inną formę lubisz. Aby uzyskać więcej informacji, sprawdź ASP.NET MVC Framework (Part 2): URL Routing. Tylko do rozruchu (ponieważ nie jestem pewien, czy jest to optymalne rozwiązanie), można dodać dwie nowe trasy w global.asax:

 routes.MapRoute(
      "ukRoute", 
      "{lang}/Products/{action}/{id}/{subcategory}", 
      new { lang = "uk", controller = "Products", action = "Index", id = "", subcategory = "" } 
     ); 
     routes.MapRoute(
      "esRoute", 
      "{lang}/Productos/{action}/{id}/{subcategory}", 
      new { lang = "es", controller = "Products", action = "Index", id = "", subcategory = "" } 
     ); 

Trasy te zrozumieć następujące adresy URL (i map oboje do ActionResult Category(string id, string subcategory) metoda ProductsController):

uk/Products/Category/1/A 
es/Productos/Category/1/A 

Jeśli chcesz stworzyć takie adresy URL w widokach można użyć coś takiego:

<%= Html.RouteLink("English 1.A", "ukRoute", new { lang = "uk", action = "Category", id = "1", subcategory = "A" })%> 
<%= Html.RouteLink("Spanish 1.A", "esRoute", new { lang = "es", action = "Category", id = "1", subcategory = "A" })%> 
+0

robi to działa? 'uk/Products/Category/1/A's/Productos/Category/1/A' W obu tych scenariuszach zostanie przekierowany do pierwszej trasy' ukRoute', ponieważ lang to pole i dopasowanie. – Saanch

+2

Myślę, że metoda wprowadzona [w tym blogu] (http://blog.maartenballiauw.be/post/2010/01/26/Translating-routes- (MVC ASPNET-i-Webforms) .aspx) jest lepszym pomysłem . – VahidNaderi

3

można to zrobić, ale pamiętaj, że nie wszystkie kraje są językami. Na przykład en-gb jest typową reprezentacją brytyjskiego angielskiego, a dokładniej, brytyjskiego locale dla angielskiej treści, na przykład. Jeśli możesz, warto przestrzegać konwencji pochodnych RFC1766 dla języka LOCALE.

Wyszukiwarki faktycznie wydają się zrobić dość dobrą pracę czynienia z treścią-negocjacji, przy okazji, więc nie muszą mieć oddzielne URI dla tej samej treści w różnych językach. Google Japan będzie indeksować z ja-JP jako nagłówek akceptacji języka, na przykład.

+0

W przypadku wyszukiwarek należy emitować atrybuty "lang" i "dir" w elemencie "html". wolę metodę cookie, które mogą być wszystkim zajmował się w Global.Kod asax (lub nawet zapakowany w macierzystą klasę podstawową HttpApplication w celu pełnej automatyzacji dla dowolnej strony internetowej MVC lub ASPX) poprzez zapisanie pliku cookie "kultury" w AquireRequestState (z domyślnym językiem przeglądarki lub strony internetowej), który można łatwo zmienić na dowolną preferencję poprzez metoda aplikacji "SetLanguage", która zmienia kulturę plików cookie i wątków. Następnie strona działa bez różnych adresów URL, a treść jest ważna (identyfikuje jej język). –