6

コントローラーで MVC5 の属性ルーティングを使用しています。

質問:

コントローラー間で属性ルーティングの優先順位を制御する方法はありますか?

次のことを考慮してください

[Route("home/{action=index}/{username?}")]
public class HomeController : Controller
{
    [Route("home/index/{username?}", Order = 1)]
    [Route("home/{username?}", Order = 2)]
    [Route("{username?}", Order = 3)]
    public ActionResult Index()
    {
        // ... bunch of stuff
    }
}

上記のコードに基づいHomeController.Index()て、次のリクエストを使用してアクション メソッドを呼び出す必要があります。

  • ドメイン/
  • ドメイン/{ユーザー名}
  • ドメイン/ホーム/
  • ドメイン/ホーム/{ユーザー名}
  • ドメイン/ホーム/インデックス/
  • ドメイン/ホーム/インデックス/{ユーザー名}

2 番目のコントローラー:

[Authorize(Roles = "Member")]
[Route("profile/{action=index}")]
public class ProfileController : Controller
{
    [Route("profile")]
    public ActionResult Index()
    {

    }
}

ProfileController.Index()、次のリクエストを使用して呼び出す必要があります。

  • ドメイン/プロフィール
  • ドメイン/プロファイル/インデックス

問題

例から、URL を送信domain/profileすると、あいまいな例外がスローされます。domain/{username}と の間にあいまいさがあるようですdomain/profile

ここで、規則ベースのルーティングを使用した場合、これはうまくいきます (最初の一致が勝ちます)。しかし、MVC5 属性ルーティングでそれを行うことはできますか? サードパーティのライブラリがコントローラー間の優先順位をサポートしていることがわかったため

https://github.com/mccalltd/AttributeRouting/wiki/Controlling-Route-Precedence

routes.MapAttributeRoutes(config =>
{
    config.AddRoutesFromController<ProfileController>();
    config.AddRoutesFromController<HomeController>();
});
4

1 に答える 1