2

MVC3でのルーティングに頭を悩ませています。

以前、私は通常、領域全体を避け、醜い古い?id=1&foo=barタイプのURLに固執していました。よくない。

このように定義された4つのルートがあります

routes.MapRoute("Blog", "{controller}/{action}/{PageNumber}/{PostsPerPage}", new { controller = "blog", action = "list", PageNumber = UrlParameter.Optional, PostsPerPage = UrlParameter.Optional });
routes.MapRoute("Code", "{controller}/{action}/{title}", new { });
routes.MapRoute("Id", "{controller}/{action}/{id}", new { });
routes.MapRoute("Default", "{controller}/{action}", new { controller = "home", action = "index" });

私はそれらを最も具体的なものから最も少ないものへと注文しようとしました。

最初の「ブログ」ルートは正常に機能し、のようなURLを使用でき/blog/list/2/5、コントローラーに正しくマップされます。

一番下のデフォルトルートも期待通りに機能しています。

ただし、次のようなアクションメソッドがある場合:

public ActionResult BarX(int id)
{
    //some stuff
}

public ActionResult BarY(string title)
{
    //some stuff
}

3番目のルートを使用して、のようなURLを生成することを期待します/foo/barX/3

しかし、私が使用する場合

@Html.ActionLink("TEST1", "barX", "foo", new { id = 3 }, null)

生成されるURLは

/foo/barx?id=3

同様に、のために生成されたURL

@Html.ActionLink("TEST2", "barY", "foo", new { title = "test" }, null)

/foo/bary?title=test

だから私の質問は、なぜ彼らは古い?id=構文ではなく古い構文でURLを生成するのかということだと思います/foo/barx/3

4

1 に答える 1

9

すべてのルートは基本的に同じです。彼らです

{controller}/{action}/{param}/{param}

ルーティングエンジンはとの違いを理解しないので、私は同じことを言い{controller}/{action}/{id}ます{controller}/{action}/{title}

そしてルートエンジンは本当にただ見るでしょう

{controller}/{action}/{PageNumber}/{PostsPerPage}

すべてのルートを最初のルートと混同します。


ルートエンジンがほぼ一般的な{optional}/{optional}/{optional}/{optional}/ルートを一番上に表示すると、要素が4つ以下であれば何でもそれに適合できるため、それ以上進むことはありません。


一方、ルートに一般的なものではなく、独特の始まりがある場合{Controller}

routes.MapRoute("Blog", "Blog/{PageNumber}/{PostsPerPage}", new { controller = "blog", action = "list", PageNumber = UrlParameter.Optional, PostsPerPage = UrlParameter.Optional });
routes.MapRoute("Code", "Code/{title}", new { controller = "code", action = "list", title = UrlParameter.Optional });
routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "home", action = "index", id = UrlParameter.Optional });

これで、ルーティングエンジンが検出するたびに、Blog/...一致できるルートは1つだけであることがわかります。他のすべての人と一緒に、それは一致するものを探し続けます。が表示されるたびにCode/...、1つのルートのみが一致します。そして、Defaultは{Controller}/{Action}/{id}、持っていない、BlogまたはCode最初のルートパラメータとしてそのようなものを処理します。

于 2013-03-25T00:41:26.680 に答える