c#
  • asp.net-mvc
  • asp.net-mvc-2
  • asp.net-mvc-routing
  • 2011-10-29 79 views 12 likes 
    12

    我使用asp.net mvc 2並創建基於路由的本地化。ASP.NET MVC Url.Action和路由名稱值

    1. 我的路線是這樣的:{culture}/{controller}/{action}
    2. 我去我家的控制器:en/Home/Index
    3. 我家的控制器視圖有一個鏈接到其他控制器:

      <a href='<%= Url.Action("Prods","Products") %>' >Products</a> 
      <a href='<%= Url.Action("Index","About") %>' >About</a> 
      

    首先鏈接生成的代碼:/en/Products/Prods但第二個生成:/Home/Index

    我不明白爲什麼Url.Action跳過{culture}路由參數,當我在參數操作中傳遞值Index?我究竟做錯了什麼?

    路由配置:所有

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    
    routes.MapRoute("Login", // Route name 
           "{controller}/Index", // URL with parameters 
           new { controller = "Login", action = "Index" } // Parameter defaults 
           ).RouteHandler = new SingleCultureMvcRouteHandler(); 
    
    routes.MapRoute("Default", // Route name 
           "{controller}/{action}/{id}", // URL with parameters 
           new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
           );  
    

    然後

    foreach (Route r in routes) 
    { 
        if (!(r.RouteHandler is SingleCultureMvcRouteHandler)) 
        { 
         r.RouteHandler = new MultiCultureMvcRouteHandler(); 
    
         r.Url = "{culture}/" + r.Url; 
    
         if (r.Defaults == null) 
         { 
          r.Defaults = new RouteValueDictionary(); 
         } 
    
         r.Defaults.Add("culture", "en"); 
    
         if (r.Constraints == null) 
         { 
          r.Constraints = new RouteValueDictionary(); 
         } 
    
         r.Constraints.Add("culture", new CultureConstraint(cultures)); 
        } 
    } 
    

    感謝幫助

    +0

    如果包含完整路線配置,則更容易發現問題。 –

    +0

    @JoãoAngelo感謝您的回覆,請查找更新 –

    +0

    @marc_s謝謝,我在所有路線後添加它:r.Url =「{culture} /」+ r.Url; –

    回答

    41

    當生成URL您的最佳選擇是要始終使用路由名稱,因爲這樣你沒有得到轉化爲用於選擇將用於生成URL的路由的算法的細微之處。

    我的建議,如果你不使用Url.Action,而是使用Url.RouteUrl,它允許您指定應該用來構造URL的路由的名稱。

    通過總是使用路由名稱,您還可以使您的代碼更加健壯地進行更改,例如,您可以添加新路由,而不必擔心它們可能會破壞現有代碼以生成URL。

    1

    爲了構建Url.Action鏈接,任何不帶id標記的Index操作都將與Login路由匹配。登錄路線使用SingleCultureMvcRouteHandler,因此文化不會被預先添加到這些鏈接。

    相關問題