Asp.net-Mvc-Routing

@Url.Action 獲得 ?Length=2 附加

  • May 13, 2013

我在“使用條款”頁面的幾個翻譯的頂部都有這個:

<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>

這是應該處理點擊的操作:

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();
       }
   }

這些是我的路線:

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}"
       );
}

從主(即英語)條款頁面,第一個(即英語)連結看起來是正確的:

http://localhost:65391/Terms/

為什麼其他(即外國)生成的 URL 看起來像這樣?

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

另外,奇怪的是,如果我手動輸入

http://localhost:65391/Terms/de

例如,轉到德語的條款頁面,那麼第一個超連結(即返回到英語條款頁面)如下所示:

http://localhost:65391/Terms/de

去這裡查看實際站點:

http://inrix.com/traffic/terms

您正在使用將第三個參數視為routeValues對象的重載。Url.Action

來自 MSDN:

routeValues

類型:System.Object

一個包含路由參數的對象。通過檢查對象的屬性通過反射檢索參數。對象通常是使用對像初始值設定項語法創建的。

因此,您已將字元串"de", "fr"作為第三個參數傳遞,因此 MVC 已獲取其屬性並生成鍵值對:這Length=2就是即將到來的地方,因為string該類具有一個屬性Length,而您的字元串的值為 2。

您可以通過傳遞包裝字元串的匿名對象輕鬆解決此問題:

<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>
...

筆記:

  • 您的匿名對象屬性名稱id應與您的路由段名稱id和控制器參數名稱匹配id
  • 您需要new { id = "" }在預設情況下明確傳遞,否則 MVC 將使用已經給定的路由值。這是你在http://localhost:65391/Terms/de案例中看到的。所以英文連結變成了http://localhost:65391/Terms/de因為 MVC 已經id在 URL 中找到了該值de並自動重用它。
  • 最後注意正確的拼寫是 Magyar 而不是 Maygar

引用自:https://stackoverflow.com/questions/15688789