ASP.NET MVC Url.Action和路由名称值

时间:2011-10-29 10:37:39

标签: c# asp.net-mvc asp.net-mvc-2 asp.net-mvc-routing

我正在使用asp.net mvc 2并根据路线创建本地化。

  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>
    
  4. 第一个链接生成代码:/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));
        }
     }
    

    感谢您的帮助

2 个答案:

答案 0 :(得分:45)

生成URL时,最好的选择是始终使用路由名称,因为这样您就不会深入了解用于选择将用于生成URL的路由的算法的细微之处。

我的建议是,如果你不使用Url.Action而是使用Url.RouteUrl,它允许你指定应该用来构建URL的路由的名称。

通过始终使用路由名称,您还可以使代码对更改更加健壮,例如,您可以添加新路由,而不必担心它们可能会破坏现有的URL生成代码。

答案 1 :(得分:1)

为了构建Url.Action链接,任何没有Index令牌的id操作都会与Login路由匹配。 Login路由使用SingleCultureMvcRouteHandler,因此不会将文化添加到这些链接。