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

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

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

  1. 我的路线如下:{culture}/{controller}/{action}
  2. 我转到我的家庭 Controller :en/Home/Index
  3. 我的家庭 Controller View 有一个到其他 Controller 的链接:

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

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

我不明白为什么当我在参数操作中传递值 IndexUrl.Action 会跳过 {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));
    }
 }

感谢大家的帮助

最佳答案

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

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

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

关于c# - ASP.NET MVC Url.Action 和路由名称值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7938332/

相关文章:

c# - 为什么有时候我抓星时分数会翻倍?

javascript - 我的数据应该在 ASP.NET MVC 应用程序中的何处进行验证?

asp.net-mvc - 如何在 MVC 中设置默认路由(到某个区域)

asp.net-mvc-2 - 使用 Ninject 的 HttpHandler 属性注入(inject)返回 null

.net - 我可以在 .net 4 上运行 asp.net mvc 1 吗?

c# - 如何在 WPF 中绑定(bind)单个对象实例?

c# - 使计时器减少实际秒数

c# - 在 MVVM 中显示对话框并设置对话框选项

asp.net-mvc - asp.net mvc 我是否为我的模型使用了太多类?

c# - OnActionExecuting 方法的 URL 重定向