web-dev-qa-db-ja.com

ASP.NET MVC 4ルート-コントローラー/ IDとコントローラー/アクション/ ID

ルートをデフォルトのルートに追加して、両方の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でこのような質問がすでにある場合は、申し訳ありません。何も見つかりませんでした。

17
Arman Bimatov

重要なのは、より具体的なルートを最初に置くことです。したがって、「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番目のパラメーターは数値である必要があるため)、次の(「デフォルト」)ルートに移動します。

35
McGarnagle