新しい.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
属性を削除しました。その後、デフォルトのルーティングは問題なく機能しました。
それは期待される動作ですか?この動作の背後にある理由は何でしょうか?
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");
}
}