ルートをデフォルトのルートに追加して、両方のURLが機能するようにします。
http://www.mywebsite.com/users/create
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でこのような質問がすでにある場合は、申し訳ありません。何も見つかりませんでした。
重要なのは、より具体的なルートを最初に置くことです。したがって、「Book」ルートを最初に置きます。 編集このルートの "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 }
);
また、「Details」アクションの「id」パラメーターがintであることを確認してください。
// "users" controller
public ActionResult books(int id)
{
// ...
}
このようにして、「Books」ルートは/users/create
のようなURLをキャッチせず(2番目のパラメーターは数値である必要があるため)、次の(「デフォルト」)ルートに移動します。