MVC4路由@ Html.ActionLink和@ Html.RouteLink生成错误的URL

Jop*_*per 9 url routing url-routing asp.net-mvc-4

嗨,大家可能会帮助我理解为什么,@Html.ActionLink@Html.RouteLink 在某些情况下产生错误的链接.

我有这样的路线:

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Catalog", // Route name
                "Catalog/{a}/{b}/{c}/{d}/{e}", // URL with parameters
                new { controller = "Catalog", action = "Index", a = UrlParameter.Optional, b = UrlParameter.Optional, c = UrlParameter.Optional, d = UrlParameter.Optional, e = UrlParameter.Optional } // Parameter defaults
            );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
Run Code Online (Sandbox Code Playgroud)

我有控制器和我的参数:

public ActionResult Index(string a, string b, string c, string d, string e)
        {
        //Do stuff;
        }
Run Code Online (Sandbox Code Playgroud)

我有一个案例列表,@Html.RouteLink@Html.ActionLink在视图上声明如下:

    @Html.ActionLink("ActionLink1","Index", new { a = "a" }, null)
    @Html.ActionLink("ActionLink2","Index", new { a = "a", b = "b" }, null)
    @Html.ActionLink("ActionLink3","Index", new { a = "a", b = "b", c = "c" }, null)
    @Html.ActionLink("ActionLink4","Index", new { a = "a", b = "b", c = "c", d = "d" }, null)
    @Html.ActionLink("ActionLink5","Index", new { a = "a", b = "b", c = "c", d = "d", e = "e" }, null)
    <br/>
    @Html.RouteLink("RouteLink1","Catalog", new { a = "a" })
    @Html.RouteLink("RouteLink2","Catalog", new { a = "a", b = "b" })
    @Html.RouteLink("RouteLink3","Catalog", new { a = "a", b = "b", c = "c" })
    @Html.RouteLink("RouteLink4","Catalog", new { a = "a", b = "b", c = "c", d = "d" })
    @Html.RouteLink("RouteLink5","Catalog", new { a = "a", b = "b", c = "c", d = "d", e = "e" 
})
Run Code Online (Sandbox Code Playgroud)

结果

目前的网址 http://localhost:2288/Catalog

ActionLink1

  • 实际结果: http://localhost:2288/Catalog?a=a
  • 预期结果: http://localhost:2288/Catalog/a

RouteLink1

  • 实际结果: http://localhost:2288/Catalog
  • 预期成绩: http://localhost:2288/Catalog/a

目前的网址 http://localhost:2288/Catalog/a

ActionLink1

  • 实际结果: http://localhost:2288/Catalog?a=a
  • 预期成绩: http://localhost:2288/Catalog/a

目前的网址 http://localhost:2288/Catalog/a/b

ActionLink1

  • 实际结果: http://localhost:2288/Catalog/a/b
  • 预期成绩:http://localhost:2288/Catalog/a

RouteLink1

  • 实际结果: http://localhost:2288/Catalog/a/b
  • 预期成绩: http://localhost:2288/Catalog/a

目前的网址 http://localhost:2288/Catalog/a/b/c

ActionLink1

  • 实际结果: http://localhost:2288/Catalog/a/b/c
  • 预期成绩: http://localhost:2288/Catalog/a

RouteLink1

  • 实际结果: http://localhost:2288/Catalog/a/b/c
  • 预期成绩: http://localhost:2288/Catalog/a

ActionLink2

  • 实际结果: http://localhost:2288/Catalog/a/b/c
  • 预期成绩: http://localhost:2288/Catalog/a/b

RouteLink2

  • 实际结果: http://localhost:2288/Catalog/a/b/c
  • 预期成绩: http://localhost:2288/Catalog/a/b

等等...


目前的网址 http://localhost:2288/Catalog/a/b/c/d

ActionLink1,ActionLink2和ActionLink3以及RouteLink1,RouteLink2和RouteLink3都产生了错误的URL.


目前的网址 http://localhost:2288/Catalog/a/b/c/d/e

所有 ActionLinks和RouteLinks(exept ActionLink5和RouteLinks5)都生成了错误的URL.


我在这里放了一个示例项目:http://www.mediafire.com/?gdbatoafgd0kf4w

也许有人可以弄清楚为什么会这样?

这个故事几天前开始,当时我正在尝试用它构建Breadcrumbs MvcSiteMapProvider,并且我得到了相同的链接MvcSiteMapProvider Breadcrumbs.在我的研究期间,我发现MvcSiteMapProvider在其他地方没有引起问题.所以我创建了默认的MVC4项目,它默认具有这种奇怪的行为.

UPDATE

它看起来就像你正在使用@Html.ActionLink@Html.RouteLink帮助url生成基于当前url ..但仍然无法理解为什么当Current url http://localhost:2288/Catalog我得到:

http://localhost:2288/Catalog?a=a而不是http://localhost:2288/Catalog/aActionLink

http://localhost:2288/Catalog不是http://localhost:2288/Catalog/aRouteLink

Dar*_*rov 7

RouteLink允许您显式指定路径名称.ActionLink按路径定义中出现的顺序评估路径.您的第一个路由声明无效,这是ActionLink帮助程序无法捕获它的原因.之所以你的第一个路由定义是无效的,因为你所做的{a},{b},{c}{d}路由参数UrlParameter.Optional,但只有最后的参数({e}一个URI路径的在你的例子)可选配.

由于RouteLink帮助程序允许您明确说明要拾取的路由,因此可以将其用作解决方法.