ASPでの使用方法NET CoreでのRouteプロパティの使用
6044 ワード
ASP.NET CoreのRouteミドルウェアの役割は、requestをそれぞれのRouteプロセッサにマッチングすることであり、Routeは
次のコードを追加するDefaultControllerクラスを作成します.
Routeプロパティは、ControllerおよびActionレベルで使用できます.前者の場合、Controllerの下にあるすべてのActionは、このRouteによって管理されます.
上記のDefaultControllerクラスコードをよく観察すると、2つのアクションメソッドのRouteパスには
ControllerとActionの両方のレベルがRouteにマークするとAspがわかる.Net CoreのRouteエンジンは自動的に両者をつなぎ合わせます.もちろん、より簡単で乱暴な方法は、Controllerで
先ほどのDefaultControllerクラスを参照して、Indexメソッドで3つのRouteプロパティを定義しました.これは、次の3つの
同様に
Route Templateでオプションのパラメータを指定することもできます.これは、このパラメータが送信されるか送信されないかを意味します.フォーマットは次のとおりです.
Routeプロパティを使用すると、ControllerまたはActionの名前は重要ではありません.Route処理エンジンはリファレンスオプションとして使用されなくなったため、次のコードクリップは、ActionメソッドでRoute templateフォーマットを変更する方法を示しています.
次に、GetRecordsByIdメソッドに直接アクセスするには、次のアドレスを使用します.
実際のシーンではidが整数でなければならないだけでなく、一定の意味を求めなければなりません.例えば、最小値が1であるなど、
intはintタイプ に限定する. max/min限定intの最大数と最小数 minlengthはstringの最小長さ を規定する regexは、適合する正則 を限定する.
上記の制約があなたの要件を満たしていない場合は、IrouteConstraintインタフェースを使用して、次のコードに示すように、シーンの深さを完全にカスタマイズできます.
全体的に見ると、
翻訳リンク:
https://www.infoworld.com/art...
もっと高品質の乾物:私のGitHub:csharptranslateを参照
モードと
モードに分けられる.
モードの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つの
Route
がIndex()
メソッドにアクセスできることを意味します.次のコードに示します.
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コンストレイント
カスタム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を参照