2013-03-28 14 views
6

Tôi có điều này ở phía trên cùng của mỗi vài bản dịch của "Quy định sử dụng" trang:@ Url.Action nhận Chiều dài = 2 nối

<li><a href="@Url.Action("Index", "Terms")">English</a></li> 
<li><a href="@Url.Action("Index", "Terms", "de")">Deutsch</a></li> 
<li><a href="@Url.Action("Index", "Terms", "fr")">Français</a></li> 
<li><a href="@Url.Action("Index", "Terms", "it")">Italiano</a></li> 
<li><a href="@Url.Action("Index", "Terms", "nl")">Nederlands</a></li> 
<li><a href="@Url.Action("Index", "Terms", "hu")">Maygar</a></li> 
<li><a href="@Url.Action("Index", "Terms", "es")">Español</a></li> 
<li><a href="@Url.Action("Index", "Terms", "zh")">简体中文</a></li> 
<li><a href="@Url.Action("Index", "Terms", "pt-pt")">European Português</a></li> 
<li><a href="@Url.Action("Index", "Terms", "pt")">Português</a></li> 

Đây là hành động mà nên xử lý các nhấp chuột:

public class TermsController : Controller 
{ 
    public ActionResult Index(string id) 
    { 
     switch (id) 
     { 
      case "de": 
       return View("de"); 
      case "fr": 
       return View("fr"); 
      case "it": 
       return View("it"); 
      case "nl": 
       return View("nl"); 
      case "hu": 
       return View("hu"); 
      case "es": 
       return View("es"); 
      case "zh": 
       return View("zh"); 
      case "pt": 
       return View("pt"); 
      case "pt-pt": 
       return View("pt-pt"); 
      default: 
       return View(); 
     } 
    } 

và đây là những tuyến đường của tôi:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     "Terms", 
     "{controller}/{id}", 
     new { controller = "Terms", action = "Index" } 
     ); 

    routes.MapRoute(
     "Default", 
     "{controller}/{action}/{id}", 
     new { controller = "Home", action = "Index", id = "" } 
     ); 

    routes.MapRoute(
     "ThankYou", 
     "{controller}/{action}/{email}/{id}" 
     ); 
} 

Từ chính (ví dụ, tiếng Anh) trang Điều khoản này, người đầu tiên (ví dụ, tiếng Anh) liên kết trông cor rect:

http://localhost:65391/Terms/ 

Tại sao URL khác được tạo ra (ví dụ: nước ngoài) trông như thế này?

http://localhost:65391/Terms/?Length=2 

Ngoài ra, kỳ quặc, nếu tôi tự gõ vào

http://localhost:65391/Terms/de 

ví dụ, và đi đến trang Điều khoản bằng tiếng Đức, sau đó các siêu liên kết đầu tiên (tức là trở lại trang Điều khoản tiếng Anh) vẻ như thế này:

http://localhost:65391/Terms/de 

tới đây để xem các trang web thực tế:

http://inrix.com/traffic/terms

+0

Chỉ sử dụng một thẻ làm cho câu hỏi của bạn khó có thể khám phá. Bạn nên gắn thẻ ít nhất với thẻ vesion MVC. như asp.net-mvc-3 hoặc asp.net-mvc-4, v.v. – nemesv

Trả lời

10

Bạn đang sử dụng an overload trong số Url.Action xử lý đối số thứ ba là đối tượng routeValues ​​.

Từ MSDN:

routeValues ​​
Loại: System.Object
Một đối tượng có chứa các thông số cho một tuyến đường. Các tham số được truy xuất thông qua sự phản ánh bằng cách kiểm tra các thuộc tính của đối tượng. Đối tượng thường là được tạo bằng cách sử dụng cú pháp trình khởi tạo đối tượng.

chuỗi Vì vậy, bạn đã trôi qua "de", "fr" như là đối số thứ ba để MVC đã lấy thuộc tính của nó và làm cho các cặp giá trị quan trọng: đó là nơi mà các Length=2 đang đến, bởi vì lớp string có một tài sản Length và giá trị là 2 cho dây của bạn.

Bạn có thể khắc phục điều này một cách dễ dàng với đi qua một đối tượng vô danh quấn dây của bạn:

<li><a href="@Url.Action("Index", "Terms" new { id = "" })">English</a></li> 
<li><a href="@Url.Action("Index", "Terms", new { id = "de" })">Deutsch</a></li> 
<li><a href="@Url.Action("Index", "Terms", new { id = "fr" })">Français</a></li> 
... 

Ghi chú:

  • tên thuộc tính đối tượng annonymous bạn id phải phù hợp với lộ trình tên phân khúc của bạn id và thông số điều khiển tên id
  • bạn cần phải vượt qua số new { id = "" } trong trường hợp mặc định nếu không thì MVC sẽ sử dụng cho các giá trị tuyến đường. Đây là những gì bạn đã thấy trong trường hợp http://localhost:65391/Terms/de.Vì vậy, liên kết tiếng Anh đã trở thành http://localhost:65391/Terms/de vì MVC đã tìm thấy giá trị id trong URL là de và tự động sử dụng lại.
  • Lưu ý cuối đúng chính tả là Magyar và không Maygar
+0

Tuyệt vời! Cảm ơn bạn! (Cảm ơn những người đứng đầu về lỗi chính tả!) – birdus