c#
  • asp.net-mvc
  • asp.net-mvc-2
  • asp.net-mvc-routing
  • 2011-10-29 94 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,因此文化不会被预先添加到这些链接。

    相关问题