web-dev-qa-db-ja.com

.net Core-ルート属性が使用されている場合、デフォルトのコントローラーがロードされていません

新しい.netコアWebアプリケーションプロジェクトには、次のルート構成が付属しています。

_    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
_

これをapp.UseMvc()に置き換え、HomeControllerとそのアクション(Index、About、Contact、Error)の両方に適切なRoute属性を追加しても、引き続き機能します。デフォルトルートを指定していないため、 http:// localhost:25137 / を押しても、デフォルトビュー(ホーム/インデックス)はレンダリングされません。理解が正しいことを願っています!

ここで、 http:// localhost:25137 / がヒットしたときにデフォルトのビューを表示する必要があるため、ルーティングコードをapp.UseMvcWithDefaultRoute();に変更しました。最初のスニペットと同等です。それでも、デフォルトのビューをレンダリングしていませんでした。ただし、完全なURL( http:// localhost:25137/home/index )を使用すると機能しました。つまり、ルーティングは引き続き機能しますが、デフォルトのルーティングではありません。

次に、コントローラーに戻り、HomeControllerとそのアクションからすべてのRoute属性を削除しました。その後、デフォルトのルーティングは問題なく機能しました。

それは期待される動作ですか?この動作の背後にある理由は何でしょうか?

8
Mahesh V S

asp docs から:

アクションは、従来の方法でルーティングされるか、属性でルーティングされます。コントローラまたはアクションにルートを配置すると、属性がルーティングされます。属性ルートを定義するアクションには、従来のルートでは到達できません。その逆も同様です。コントローラのルート属性は、コントローラ属性のすべてのアクションをルーティングします。

したがって、基本的に属性を使用する場合、UseMvcまたはUseMvcWithDefaultRouteで定義されたルートは無視されます。その場合、属性のみが使用されます。

オプションのセグメントを使用したデフォルトルートと同様の効果を実現したい場合は、複数のルート属性を使用できます。再び asp docs の同じ記事から:

public class MyDemoController : Controller
{
   [Route("")]
   [Route("Home")]
   [Route("Home/Index")]
   public IActionResult MyIndex()
   {
      return View("Index");
   }
   [Route("Home/About")]
   public IActionResult MyAbout()
   {
      return View("About");
   }
   [Route("Home/Contact")]
   public IActionResult MyContact()
   {
      return View("Contact");
   }
}
21
Daniel J.G.