21

デフォルトのルートにルートを追加して、両方の URL が機能するようにしようとしています。

  1. http://www.mywebsite.com/users/create
  2. http://www.mywebsite.com/users/1

これにより、最初のルートが機能します。

routes.MapRoute(
     name: "Default",
     url: "{controller}/{action}/{id}",
     defaults: new { controller = "users", action = "Index", id = UrlParameter.Optional }
);

ただし、2 番目のルートは明らかに機能しません。

これにより、2 番目のルートは機能しますが、最初のルートは機能しなくなります。

routes.MapRoute(
     name: "Book",
     url: "books/{id}",
     defaults: new { controller = "users", action = "Details" }
);

両方の URL が機能するように 2 つのルート構成を組み合わせるにはどうすればよいですか? SO でこのような質問が既にある場合は申し訳ありませんが、何も見つかりませんでした。

4

1 に答える 1

36

重要なのは、より具体的なルートを最初に置くことです。したがって、「本」ルートを最初に置きます。 編集このルートの「id」部分に一致する数字のみを許可する制約も必要だと思います。編集を終了

routes.MapRoute(
    name: "Book",
    url: "books/{id}",
    defaults: new { controller = "users", action = "Details" },
    constraints: new { id = @"\d+" }
);

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "users", action = "Index", id = UrlParameter.Optional }
);

また、「詳細」アクションの「id」パラメーターが int であることを確認してください。

// "users" controller
public ActionResult books(int id)
{
    // ...
}

このように、"Books" ルートは URL のようなものをキャッチせず/users/create(2 番目のパラメーターは数値である必要があるため)、次の ("デフォルト") ルートにフォールスルーします。

于 2013-08-03T23:43:20.583 に答える