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

C# ASP.NET MVC Url.Action和路由名称值,c#,asp.net-mvc,asp.net-mvc-2,asp.net-mvc-routing,C#,Asp.net Mvc,Asp.net Mvc 2,Asp.net Mvc Routing,我正在使用asp.net mvc 2并基于路由创建本地化 我的路由看起来像:{culture}/{controller}/{action} 我转到我的家庭控制器:en/home/Index “我的主控制器”视图具有指向其他控制器的链接: <a href='<%= Url.Action("Prods","Products") %>' >Products</a> <a href='<%= Url.Action("Index","About") %>

我正在使用asp.net mvc 2并基于路由创建本地化

  • 我的路由看起来像:
    {culture}/{controller}/{action}
  • 我转到我的家庭控制器:
    en/home/Index
  • “我的主控制器”视图具有指向其他控制器的链接:

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


    感谢所有帮助

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

    我建议您不要使用
    Url.Action
    ,而是使用它,它允许您指定用于构建Url的路由名称


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

    为了构建URL。操作链接,任何没有
    id
    令牌的
    索引
    操作都将与
    登录
    路径匹配。登录路由使用SingleCultureMvcRouteHandler,因此不会在这些链接前添加区域性。

    如果包含完整路由配置,则更容易发现问题。@João Angelo感谢您的回复,请查看update@marc_s谢谢,我在这里的所有路由之后添加它:r.Url=“{culture}/”+r.Url;查看哪一个工具是了解哪些路由被选中以及为什么被选中的好工具…@marc\s非常感谢提供有用的路由调试器链接
    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));
        }
     }