ASPでの使用方法NET CoreでのRouteプロパティの使用

6044 ワード

ASP.NET CoreのRouteミドルウェアの役割は、requestをそれぞれのRouteプロセッサにマッチングすることであり、Routeは モードと モードに分けられる. モードのRouteは集中的な方式を採用し、 の方式はActionまたはController上で単独で定義することができ、いったいどれを採用して自分のアプリケーションシーンに基づいて、本編では モードをどのように使用するかを議論します.

Controllerクラスの作成


次のコードを追加するDefaultControllerクラスを作成します.

    public class DefaultController : Controller
    {
        [Route("")]
        [Route("Default")]
        [Route("Default/Index")]
        public ActionResult Index()
        {
            return new EmptyResult();
        }
        [Route("Default/GetRecordsById/{id}")]
        public ActionResult GetRecordsById(int id)
        {
            string str = string.Format
            ("The id passed as parameter is: {0}", id);
            return Ok(str);
        }
    }

Controllerレベル定義Routeプロパティ


Routeプロパティは、ControllerおよびActionレベルで使用できます.前者の場合、Controllerの下にあるすべてのActionは、このRouteによって管理されます.
上記のDefaultControllerクラスコードをよく観察すると、2つのアクションメソッドのRouteパスにはDefault接頭辞があります.これは優雅ではありません.最適化方法は、RouteパスのDefaultをControllerレベルに抽出することです.コードは次のとおりです.

[Route("Default")]   
public class DefaultController : Controller
{
  [Route("")]
  [Route("Index")]
  public ActionResult Index()
  {
      return new EmptyResult();
   }
  [HttpGet]
  [Route("GetRecordsById/{id}")]
  public ActionResult GetRecordsById(int id)
  {
      string str = string.Format("The id passed as parameter is: {0}", id);
      return Ok(str);
   }
}

ControllerとActionの両方のレベルがRouteにマークするとAspがわかる.Net CoreのRouteエンジンは自動的に両者をつなぎ合わせます.もちろん、より簡単で乱暴な方法は、Controllerで RoutePrefixの特性を使用することです.次のコードに示します.

[RoutePrefix("services")]
public class HomeController : Controller
{
   //Action methods
}

Actionレベル定義Routeプロパティ


先ほどのDefaultControllerクラスを参照して、Indexメソッドで3つのRouteプロパティを定義しました.これは、次の3つのRouteIndex()メソッドにアクセスできることを意味します.次のコードに示します.

http://localhost:11277
http://localhost:11277/home
http://localhost:11277/home/index

モードのRouteでは、次のコードのようなパラメータの約束がいくつかあります.

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });

同様にRoute templateモードのRouteもパラメータモードを使用することができます.例えば、文章の前の がそうです.テンプレートのDefaultController.GetRecordsByIdはstring、intなど、任意のパラメータを受信できることを示しています.intに限定したい場合は、実現できます.

Routeコンストレイントの使用

{id}はControllerの前のファイアウォールで、彼はいくつかの規範に合わないAction要求を蹴り落とします.例えば、Actionが受信するパラメータはintでなければならないことを要求します.それでは、Routeテンプレートで定義された構文フォーマットは必ずこのようなRoute で、以下のコードに示されています.

[Route("Default/GetRecordsById/{id:int}")]
public ActionResult GetRecordsById(int id)
{
  string str = string.Format("The id passed as parameter is: {0}", id);
  return Ok(str);
}

Routeでのオプションパラメータの使用


Route Templateでオプションのパラメータを指定することもできます.これは、このパラメータが送信されるか送信されないかを意味します.フォーマットは次のとおりです.

[Route("Sales/GetSalesByRegionId/{id?}")]

Routeプロパティを使用すると、ControllerまたはActionの名前は重要ではありません.Route処理エンジンはリファレンスオプションとして使用されなくなったため、次のコードクリップは、ActionメソッドでRoute templateフォーマットを変更する方法を示しています.

[Route("Home/GetRecordsById/{id:int}")]
public ActionResult GetRecordsById(int id)
{
   string str = string.Format("The id passed as parameter is: {0}", id);
   return Ok(str);
}

次に、GetRecordsByIdメソッドに直接アクセスするには、次のアドレスを使用します.

http://localhost:11277/home/GetRecordsById/1

Actionのパラメータに複数の制約を使用する


実際のシーンではidが整数でなければならないだけでなく、一定の意味を求めなければなりません.例えば、最小値が1であるなど、 {parameter:constraint}の需要をどのように実現しますか.次のコードを見てください.

[Route("Default/GetRecordsById/{id:int:min(1)}")]
public ActionResult GetRecordsById(int id)
{
    string str = string.Format("The id passed as parameter is: {0}", id);
    return Ok(str);
}

よく使用されるRouteコンストレイント

  • intはintタイプ
  • に限定する.
  • max/min限定intの最大数と最小数
  • minlengthはstringの最小長さ
  • を規定する
  • regexは、適合する正則
  • を限定する.

    カスタムRouteコンストレイントの作成


    上記の制約があなたの要件を満たしていない場合は、IrouteConstraintインタフェースを使用して、次のコードに示すように、シーンの深さを完全にカスタマイズできます.
    
        public class CustomRouteConstraint : IRouteConstraint
        {
            public bool Match(HttpContext httpContext, IRouter route,
            string routeKey,
            RouteValueDictionary values, RouteDirection routeDirection)
            {
                throw new NotImplementedException();
            }
        }
    

    Controllerでtokenプレースホルダを使用する

    とは、いくつかの特定の意味を持つ占有記号です.例えば、token は、あなたの本当のControllerとActionで置き換えることを示しています.次のコードは、このモードを使用して実現する方法を示しています.
    
    [Route("[controller]/[action]")]
    public class HomeController : Controller
    {
       private readonly ILogger _logger;
       public HomeController(ILogger logger)
       {
           _logger = logger;
       }
       public IActionResult Index()
       {
           return View();
       }
       //Other action methods
    }
    

    全体的に見ると、[action], [area] [controller]のRouteはあなたにもっと多くの操作権限を与えて、柔軟なRoute Template配置はControllerとActionのデカップリングを実現しました.もちろん、ここでも のRouteが悪いわけではありません.結局、人はGlobalレベルなので、実際のシーンでは両者が混ざっています.
    翻訳リンク:
    https://www.infoworld.com/art...
    もっと高品質の乾物:私のGitHub:csharptranslateを参照