【问题标题】:ASP.NET MVC Url.Action and route name valueASP.NET MVC Url.Action 和路由名称值
【发布时间】:2011-12-17 19:25:01
【问题描述】:

我正在使用 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>
    

第一个链接生成代码:/en/Products/Prods,但第二个生成代码:/Home/Index

我不明白为什么Url.Action 在参数操作中传递值Index 时会跳过{culture} 路由参数?我做错了什么?

路线配置:

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

感谢大家的帮助

【问题讨论】:

  • 如果您包含完整的路线配置,则更容易找到问题。
  • @João Angelo 感谢您的回复,请寻找更新
  • @marc_s 谢谢,我在所有路线之后添加它:r.Url = "{culture}/" + r.Url;
  • 查看Phil Haack's Route debugger,这是一个很好的工具,可以帮助您了解选择了哪些路线以及为什么选择...
  • @marc_s 非常感谢有用的路由调试器链接

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-11
      • 2020-12-28
      • 2016-02-10
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      相关资源
      最近更新 更多