8

誰かが理由を理解し、場合によっては間違ったリンクを作成するの@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 }
        );
    }

私は自分のパラメータを持つコントローラを持っています:

public ActionResult Index(string a, string b, string c, string d, string e)
        {
        //Do stuff;
        }

そのように宣言されたビュー@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" 
})

結果

現在の URL 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

現在の URL http://localhost:2288/Catalog/a

ActionLink1

  • 実結果: http://localhost:2288/Catalog?a=a
  • 予想された結果: http://localhost:2288/Catalog/a

現在の URL 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

現在の URL 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

等々...


現在の URL http://localhost:2288/Catalog/a/b/c/d

ActionLink1、ActionLink2、ActionLink3、および RouteLink1、RouteLink2、RouteLink3 はすべて間違った URL を生成しています。


現在の URL http://localhost:2288/Catalog/a/b/c/d/e

すべてのActionLinks と RouteLinks (ActionLink5 と RouteLinks5 を除く) が間違った URL を生成しています。


ここにサンプル プロジェクトを置きます: http://www.mediafire.com/?gdbatoafgd0kf4w

誰かがなぜそれが起こっているのか理解できるでしょうか?

その話は、数日前に でブレッドクラムを作成しようとしていたときに始まり、MvcSiteMapProviderによって作成された同じリンクを取得しましたMvcSiteMapProvider Breadcrumbs。私の調査中にMvcSiteMapProvider、問題を別の場所で引き起こしていないことがわかりました。だから私はデフォルトのMVC4プロジェクトを作成しましたが、デフォルトではそのような奇妙な動作をしています。

アップデート

現在のURLに基​​づいて生成されたヘルパーURLを使用しているときのように見えます..しかし、私が得ているときの理由をまだ理解でき@Html.ActionLinkません:@Html.RouteLinkCurrent url http://localhost:2288/Catalog

http://localhost:2288/Catalog?a=ahttp://localhost:2288/Catalog/aの場合の代わりにActionLink

の場合のhttp://localhost:2288/Catalog代わりにhttp://localhost:2288/Catalog/aRouteLink

4

1 に答える 1

7

RouteLink を使用すると、ルート名を明示的に指定できます。ActionLink は、ルート定義に表示された順序でルートを評価します。最初のルート宣言が無効であり、これが ActionLink ヘルパーがキャプチャできない理由です。最初のルート定義が無効である理由は、、、およびルート パラメータを作成したためですが{a}、URIパス{b}のLAST パラメータ (この例では) のみをオプションにすることができます。{c}{d}UrlParameter.Optional{e}

RouteLinkヘルパーを使用すると、ピックアップしたいルートを明示的に指定できるため、回避策として使用できます。

于 2013-04-19T08:19:37.613 に答える