ASP.NET Core でのモデル バインドModel Binding in ASP.NET Core

この記事では、モデル バインドとは何か、そのしくみ、その動作のカスタマイズ方法を説明します。This article explains what model binding is, how it works, and how to customize its behavior.

サンプル コードを表示またはダウンロードします (ダウンロード方法)。View or download sample code (how to download).

モデル バインドとは何かWhat is Model binding

コントローラーと Razor ページは、HTTP 要求から取得されたデータを処理します。Controllers and Razor pages work with data that comes from HTTP requests. たとえば、ルート データからはレコード キーが提供され、ポストされたフォーム フィールドからはモデルのプロパティ用の値が提供されます。For example, route data may provide a record key, and posted form fields may provide values for the properties of the model. これらの各値を取得してそれらを文字列から .NET 型に変換するためのコードを記述するのは、面倒で間違いも起こりやすいでしょう。Writing code to retrieve each of these values and convert them from strings to .NET types would be tedious and error-prone. モデル バインドを使用すれば、このプロセスを自動化できます。Model binding automates this process. モデル バインド システムでは次のことが行われます。The model binding system:

  • ルート データ、フォーム フィールド、クエリ文字列などのさまざまなソースからデータを取得します。Retrieves data from various sources such as route data, form fields, and query strings.
  • Razorメソッドパラメーターおよびパブリックプロパティのデータをコントローラーおよびページに提供します。Provides the data to controllers and Razor pages in method parameters and public properties.
  • 文字列データを .NET 型に変換します。Converts string data to .NET types.
  • 複合型のプロパティを更新します。Updates properties of complex types.

Example

次のアクション メソッドがあるとします。Suppose you have the following action method:

[HttpGet("{id}")]
public ActionResult<Pet> GetById(int id, bool dogsOnly)

さらにアプリでは、この URL を使用して要求が受信されます。And the app receives a request with this URL:

http://contoso.com/api/pets/2?DogsOnly=true

ルーティング システムでアクション メソッドが選択されたら、モデル バインドでは次の手順が実行されます。Model binding goes through the following steps after the routing system selects the action method:

  • GetByID の最初のパラメーター (id という名前の整数型) を検索します。Finds the first parameter of GetByID, an integer named id.
  • HTTP 要求内で利用可能なソースを調べ、ルート データ内で id = "2" を検索します。Looks through the available sources in the HTTP request and finds id = "2" in route data.
  • 文字列 "2" を整数 2 に変換します。Converts the string "2" into integer 2.
  • GetByID の次のパラメーター (dogsOnly という名前のブール型) を検索します。Finds the next parameter of GetByID, a boolean named dogsOnly.
  • 該当するソース内を調べ、クエリ文字列内で "DogsOnly=true" を検索します。Looks through the sources and finds "DogsOnly=true" in the query string. 名前の照合では大文字と小文字が区別されません。Name matching is not case-sensitive.
  • 文字列 "true" をブール型の true に変換します。Converts the string "true" into boolean true.

次にフレームワークによって GetById メソッドが呼び出され、id パラメーターには 2 が、dogsOnly パラメーターには true が渡されます。The framework then calls the GetById method, passing in 2 for the id parameter, and true for the dogsOnly parameter.

上記の例で、モデル バインディング ターゲットは単純型のメソッド パラメーターになっています。In the preceding example, the model binding targets are method parameters that are simple types. ターゲットは複合型のプロパティになる場合もあります。Targets may also be the properties of a complex type. 各プロパティが正常にバインドされたら、そのプロパティに対してモデル検証が行われます。After each property is successfully bound, model validation occurs for that property. どのようなデータがモデルにバインドされているかを示す記録、バインド エラー、または検証のエラーは、ControllerBase.ModelState または PageModel.ModelState に格納されます。The record of what data is bound to the model, and any binding or validation errors, is stored in ControllerBase.ModelState or PageModel.ModelState. このプロセスが正常終了したかどうかを確認するために、アプリでは ModelState.IsValid フラグが調べられます。To find out if this process was successful, the app checks the ModelState.IsValid flag.

ターゲットTargets

モデル バインドでは、次の種類のターゲットの値について検索が試みられます。Model binding tries to find values for the following kinds of targets:

  • 要求のルーティング先であるコントローラー アクション メソッドのパラメーター。Parameters of the controller action method that a request is routed to.
  • Razor要求がルーティングされるページハンドラーメソッドのパラメーター。Parameters of the Razor Pages handler method that a request is routed to.
  • 属性によって指定されている場合は、コントローラーまたは PageModel クラスのパブリック プロパティ。Public properties of a controller or PageModel class, if specified by attributes.

[BindProperty] 属性[BindProperty] attribute

コントローラーまたは PageModel クラスのパブリック プロパティに適用できます。これによってモデル バインドはそのプロパティをターゲットとするようになります。Can be applied to a public property of a controller or PageModel class to cause model binding to target that property:

public class EditModel : InstructorsPageModel
{
    [BindProperty]
    public Instructor Instructor { get; set; }

[BindProperties] 属性[BindProperties] attribute

ASP.NET Core 2.1 以降で使用できます。Available in ASP.NET Core 2.1 and later. コントローラーまたは PageModel クラスに適用できます。これによってモデル バインドはクラスのすべてのパブリック プロパティをターゲットとするように指示されます。Can be applied to a controller or PageModel class to tell model binding to target all public properties of the class:

[BindProperties(SupportsGet = true)]
public class CreateModel : InstructorsPageModel
{
    public Instructor Instructor { get; set; }

HTTP GET 要求のモデル バインドModel binding for HTTP GET requests

既定では、プロパティは HTTP GET 要求にバインドされません。By default, properties are not bound for HTTP GET requests. 通常、GET 要求に必要なのはレコード ID パラメーターのみです。Typically, all you need for a GET request is a record ID parameter. レコード ID は、データベース内の項目の検索に使用されます。The record ID is used to look up the item in the database. そのため、モデルのインスタンスを保持するプロパティをバインドする必要はありません。Therefore, there is no need to bind a property that holds an instance of the model. GET 要求からのデータにプロパティがバインドされるようにするシナリオでは、SupportsGet プロパティを true に設定します。In scenarios where you do want properties bound to data from GET requests, set the SupportsGet property to true:

[BindProperty(Name = "ai_user", SupportsGet = true)]
public string ApplicationInsightsCookie { get; set; }

ソースSources

既定では、モデル バインドでは HTTP 要求内の次のソースからキーと値のペアの形式でデータが取得されます。By default, model binding gets data in the form of key-value pairs from the following sources in an HTTP request:

  1. フォーム フィールドForm fields
  2. 要求本文 ([ApiController] 属性を持つコントローラー の場合)。The request body (For controllers that have the [ApiController] attribute.)
  3. ルート データRoute data
  4. クエリ文字列パラメーターQuery string parameters
  5. アップロード済みのファイルUploaded files

ターゲット パラメーターまたはプロパティごとに、前述の一覧に示されている順序でソースがスキャンされます。For each target parameter or property, the sources are scanned in the order indicated in the preceding list. 次のようにいくつかの例外があります。There are a few exceptions:

  • ルート データとクエリ文字列の値は単純型にのみ使用されます。Route data and query string values are used only for simple types.
  • アップロード済みのファイルは、IFormFile または IEnumerable<IFormFile> を実装するターゲットの種類にのみバインドされます。Uploaded files are bound only to target types that implement IFormFile or IEnumerable<IFormFile>.

既定のソースが正しくない場合は、次のいずれかの属性を使用してソースを指定します。If the default source is not correct, use one of the following attributes to specify the source:

  • [FromQuery]-クエリ文字列から値を取得します。[FromQuery] - Gets values from the query string.
  • [FromRoute]-ルートデータから値を取得します。[FromRoute] - Gets values from route data.
  • [FromForm]-ポストされたフォームフィールドから値を取得します。[FromForm] - Gets values from posted form fields.
  • [FromBody]-要求本文から値を取得します。[FromBody] - Gets values from the request body.
  • [FromHeader]-HTTP ヘッダーから値を取得します。[FromHeader] - Gets values from HTTP headers.

これらの属性: These attributes:

  • 次の例のように、(モデル クラスにではなく) モデル プロパティに個別に追加されます。Are added to model properties individually (not to the model class), as in the following example:

    public class Instructor
    {
        public int ID { get; set; }
    
        [FromQuery(Name = "Note")]
        public string NoteFromQueryString { get; set; }
    
  • 必要に応じて、コンストラクター内のモデル名の値を受け取ります。Optionally accept a model name value in the constructor. このオプションは、プロパティ名と要求内の値とが一致しない場合に指定されます。This option is provided in case the property name doesn't match the value in the request. たとえば、要求内の値は、次の例のようにその名前にハイフンが含まれている場合、ヘッダーである可能性があります。For instance, the value in the request might be a header with a hyphen in its name, as in the following example:

    public void OnGet([FromHeader(Name = "Accept-Language")] string language)
    

[FromBody] 属性[FromBody] attribute

[FromBody] 属性をパラメーターに適用すると、HTTP 要求の本文からそのプロパティが設定されます。Apply the [FromBody] attribute to a parameter to populate its properties from the body of an HTTP request. ASP.NET Core ランタイムでは、本文を読み取る責任が入力フォーマッタに委任されます。The ASP.NET Core runtime delegates the responsibility of reading the body to an input formatter. 入力フォーマッタについては、この記事で後ほど説明します。Input formatters are explained later in this article.

[FromBody] を複合型パラメーターに適用すると、そのプロパティに適用されているバインディング ソース属性はいずれも無視されます。When [FromBody] is applied to a complex type parameter, any binding source attributes applied to its properties are ignored. たとえば、次の Create アクションでは、その pet パラメーターを本文から設定するように指定されています。For example, the following Create action specifies that its pet parameter is populated from the body:

public ActionResult<Pet> Create([FromBody] Pet pet)

Pet クラスでは、Breed プロパティをクエリ文字列パラメーターから設定するように指定されています。The Pet class specifies that its Breed property is populated from a query string parameter:

public class Pet
{
    public string Name { get; set; }

    [FromQuery] // Attribute is ignored.
    public string Breed { get; set; }
}

前の例の場合:In the preceding example:

  • [FromQuery] 属性は無視されます。The [FromQuery] attribute is ignored.
  • Breed プロパティは、クエリ文字列パラメーターから設定されません。The Breed property is not populated from a query string parameter.

入力フォーマッタでは本文のみが読み取られ、バインディング ソース属性は認識されません。Input formatters read only the body and don't understand binding source attributes. 本文内で適切な値が見つかった場合は、その値を使用して Breed プロパティが設定されます。If a suitable value is found in the body, that value is used to populate the Breed property.

アクション メソッドごとに [FromBody] を複数のパラメーターに適用しないでください。Don't apply [FromBody] to more than one parameter per action method. 入力フォーマッタによって要求ストリームが読み取られると、他の [FromBody] パラメーターをバインドするためにそれを再度読み取ることはできません。Once the request stream is read by an input formatter, it's no longer available to be read again for binding other [FromBody] parameters.

その他のソースAdditional sources

ソース データは、"値プロバイダー" によってモデル バインド システムに提供されます。Source data is provided to the model binding system by value providers. モデル バインド用に、他のソースからデータを取得するカスタムの値プロバイダーを作成して登録することができます。You can write and register custom value providers that get data for model binding from other sources. たとえば、またはセッション状態のデータが必要になる場合があり cookie ます。For example, you might want data from cookies or session state. 新しいソースからデータを取得するには: To get data from a new source:

  • IValueProvider を実装するクラスを作成します。Create a class that implements IValueProvider.
  • IValueProviderFactory を実装するクラスを作成します。Create a class that implements IValueProviderFactory.
  • Startup.ConfigureServices 内のファクトリ クラスを登録します。Register the factory class in Startup.ConfigureServices.

サンプルアプリには、s から値を取得する値プロバイダーファクトリの例が含まれてい cookie ます。The sample app includes a value provider and factory example that gets values from cookies. Startup.ConfigureServices 内の登録コードを次に示します。Here's the registration code in Startup.ConfigureServices:

services.AddRazorPages()
    .AddMvcOptions(options =>
{
    options.ValueProviderFactories.Add(new CookieValueProviderFactory());
    options.ModelMetadataDetailsProviders.Add(
        new ExcludeBindingMetadataProvider(typeof(System.Version)));
    options.ModelMetadataDetailsProviders.Add(
        new SuppressChildValidationMetadataProvider(typeof(System.Guid)));
})
.AddXmlSerializerFormatters();

表示したコードでは、すべての組み込み値プロバイダーの後にカスタムの値プロバイダーが配置されています。The code shown puts the custom value provider after all the built-in value providers. それをリストの最初に持ってくるには、Add ではなく Insert(0, new CookieValueProviderFactory()) を呼び出します。To make it the first in the list, call Insert(0, new CookieValueProviderFactory()) instead of Add.

モデル プロパティ用のソースがないNo source for a model property

既定では、モデル プロパティ用の値が見つからない場合、モデル状態エラーは作成されません。By default, a model state error isn't created if no value is found for a model property. プロパティは次のように null 値または既定値に設定されます。The property is set to null or a default value:

  • null 許容単純型は null に設定されます。Nullable simple types are set to null.
  • null 非許容値型は default(T) に設定されます。Non-nullable value types are set to default(T). たとえば、パラメーター int id は 0 に設定されます。For example, a parameter int id is set to 0.
  • 複合型の場合、モデル バインドでは、プロパティを設定せずに既定のコンストラクターを使用して、インスタンスが作成されます。For complex Types, model binding creates an instance by using the default constructor, without setting properties.
  • 配列は Array.Empty<T>() に設定されます。例外として、byte[] 配列は null に設定されます。Arrays are set to Array.Empty<T>(), except that byte[] arrays are set to null.

モデルプロパティのフォームフィールドに何も見つからない場合にモデルの状態を無効にする必要がある場合は、属性を使用し [BindRequired] ます。If model state should be invalidated when nothing is found in form fields for a model property, use the [BindRequired] attribute.

この [BindRequired] 動作は、要求本文内の JSON または XML データに対してではなく、ポストされたフォーム データからのモデル バインドに適用されることに注意してください。Note that this [BindRequired] behavior applies to model binding from posted form data, not to JSON or XML data in a request body. 要求本文データは、入力フォーマッタによって処理されます。Request body data is handled by input formatters.

型変換エラーType conversion errors

ソースは見つかってもそれをターゲットの種類に変換できない場合、無効であることを示すフラグがモデル状態に付けられます。If a source is found but can't be converted into the target type, model state is flagged as invalid. 前のセクションで説明したように、ターゲットのパラメーターまたはプロパティは null または既定値に設定されます。The target parameter or property is set to null or a default value, as noted in the previous section.

[ApiController] 属性を持つ API コントローラーでは、モデル状態が無効であると、HTTP 400 の自動応答が生成されます。In an API controller that has the [ApiController] attribute, invalid model state results in an automatic HTTP 400 response.

ページで、次のエラーメッセージが表示さ Razor れたページを再び表示します。In a Razor page, redisplay the page with an error message:

public IActionResult OnPost()
{
    if (!ModelState.IsValid)
    {
        return Page();
    }

    _instructorsInMemoryStore.Add(Instructor);
    return RedirectToPage("./Index");
}

クライアント側の検証では、ページフォームに送信される可能性のあるほとんどの不適切なデータをキャッチ Razor します。Client-side validation catches most bad data that would otherwise be submitted to a Razor Pages form. この検証により、前の強調表示されたコードをトリガーするのが難しくなります。This validation makes it hard to trigger the preceding highlighted code. サンプル アプリには、[Submit with Invalid Date] ボタンが含まれており、これを使用すると、[Hire Date] フィールドに不適切なデータが入力され、そのフォームが送信されます。The sample app includes a Submit with Invalid Date button that puts bad data in the Hire Date field and submits the form. このボタンを使用すると、データ変換エラーが発生したときにページを再表示するためのコードがどのように機能するかを表示できます。This button shows how the code for redisplaying the page works when data conversion errors occur.

上のコードでページが再表示されると、無効な入力はフォーム フィールドに表示されません。When the page is redisplayed by the preceding code, the invalid input is not shown in the form field. これは、モデル プロパティが null または既定値に設定されているためです。This is because the model property has been set to null or a default value. 無効な入力はエラー メッセージに表示されます。The invalid input does appear in an error message. しかし、フォーム フィールドに不適切なデータを再表示したい場合は、モデル プロパティを文字列にしてデータ変換を手動で行うことを検討してください。But if you want to redisplay the bad data in the form field, consider making the model property a string and doing the data conversion manually.

型変換エラーが結果的にモデル状態エラーになることを望まない場合も同じ方法をお勧めします。The same strategy is recommended if you don't want type conversion errors to result in model state errors. その場合は、モデル プロパティを文字列にします。In that case, make the model property a string.

単純型Simple types

モデル バインダーでソース文字列の変換先とすることができる単純型には次のものがあります。The simple types that the model binder can convert source strings into include the following:

複合型Complex types

複合型には、バインドする既定のパブリック コンストラクターと書き込み可能なパブリック プロパティが必要です。A complex type must have a public default constructor and public writable properties to bind. モデル バインドが行われると、クラスは既定のパブリック コンストラクターを使用してインスタンス化されます。When model binding occurs, the class is instantiated using the public default constructor.

複合型のプロパティごとに、モデル バインドでは名前パターン prefix.property_name がないかソースが調べられます。For each property of the complex type, model binding looks through the sources for the name pattern prefix.property_name. 何も見つからない場合は、プレフィックスなしで property_name だけが探索されます。If nothing is found, it looks for just property_name without the prefix.

パラメーターにバインドする場合、プレフィックスはパラメーター名です。For binding to a parameter, the prefix is the parameter name. PageModel パブリック プロパティにバインドする場合、プレフィックスはパブリック プロパティ名です。For binding to a PageModel public property, the prefix is the public property name. 一部の属性には、パラメーター名またはプロパティ名の既定の使用をオーバーライドするための Prefix プロパティがあります。Some attributes have a Prefix property that lets you override the default usage of parameter or property name.

たとえば、複合型が次の Instructor クラスであるとします。For example, suppose the complex type is the following Instructor class:

public class Instructor
{
    public int ID { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
}

プレフィックス = パラメーター名Prefix = parameter name

バインドされるモデルが instructorToUpdate という名前のパラメーターである場合: If the model to be bound is a parameter named instructorToUpdate:

public IActionResult OnPost(int? id, Instructor instructorToUpdate)

モデル バインドでは、キー instructorToUpdate.ID がないかソースを調べることから始まります。Model binding starts by looking through the sources for the key instructorToUpdate.ID. 見つからない場合は、プレフィックスなしで ID が探索されます。If that isn't found, it looks for ID without a prefix.

プレフィックス = プロパティ名Prefix = property name

バインドされるモデルがコントローラーの Instructor という名前のプロパティか、または PageModel クラスである場合: If the model to be bound is a property named Instructor of the controller or PageModel class:

[BindProperty]
public Instructor Instructor { get; set; }

モデル バインドでは、キー Instructor.ID がないかソースを調べることから始まります。Model binding starts by looking through the sources for the key Instructor.ID. 見つからない場合は、プレフィックスなしで ID が探索されます。If that isn't found, it looks for ID without a prefix.

カスタム プレフィックスCustom prefix

バインドされるモデルが instructorToUpdate という名前のパラメーターであり、かつ Bind 属性でプレフィックスとして Instructor が指定されている場合: If the model to be bound is a parameter named instructorToUpdate and a Bind attribute specifies Instructor as the prefix:

public IActionResult OnPost(
    int? id, [Bind(Prefix = "Instructor")] Instructor instructorToUpdate)

モデル バインドでは、キー Instructor.ID がないかソースを調べることから始まります。Model binding starts by looking through the sources for the key Instructor.ID. 見つからない場合は、プレフィックスなしで ID が探索されます。If that isn't found, it looks for ID without a prefix.

複合型のターゲットの属性Attributes for complex type targets

複合型のモデル バインドを制御するために利用できる組み込みの属性がいくつかあります。Several built-in attributes are available for controlling model binding of complex types:

  • [BindRequired]
  • [BindNever]
  • [Bind]

注意

ポストされたフォーム データが値のソースである場合、これらの属性はモデル バインドに影響します。These attributes affect model binding when posted form data is the source of values. ポストされた JSON および XML 要求本文を処理する入力フォーマッタには影響しません。They do not affect input formatters, which process posted JSON and XML request bodies. 入力フォーマッタについては、この記事で後ほど説明します。Input formatters are explained later in this article.

モデル検証に関するページにある [Required] 属性の説明も参照してください。See also the discussion of the [Required] attribute in Model validation.

[BindRequired] 属性[BindRequired] attribute

モデルのプロパティにのみに適用でき、メソッドのパラメーターには適用できません。Can only be applied to model properties, not to method parameters. モデルのプロパティに対してバインドを実行できない場合に、モデル バインドがモデル状態エラーを追加できるようにします。Causes model binding to add a model state error if binding cannot occur for a model's property. 次に例を示します。Here's an example:

public class InstructorWithCollection
{
    public int ID { get; set; }

    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    [Display(Name = "Hire Date")]
    [BindRequired]
    public DateTime HireDate { get; set; }

[BindNever] 属性[BindNever] attribute

モデルのプロパティにのみに適用でき、メソッドのパラメーターには適用できません。Can only be applied to model properties, not to method parameters. モデル バインドがモデルのプロパティを設定できないようにします。Prevents model binding from setting a model's property. 次に例を示します。Here's an example:

public class InstructorWithDictionary
{
    [BindNever]
    public int ID { get; set; }

[Bind] 属性[Bind] attribute

クラスまたはメソッド パラメーターに適用できます。Can be applied to a class or a method parameter. モデルのどのプロパティをモデル バインドに含めるかを指定します。Specifies which properties of a model should be included in model binding.

次の例では、任意のハンドラーまたはアクション メソッドが呼び出されると、Instructor モデルの指定されたプロパティのみがバインドされます。In the following example, only the specified properties of the Instructor model are bound when any handler or action method is called:

[Bind("LastName,FirstMidName,HireDate")]
public class Instructor

次の例では、OnPost メソッドが呼び出されると、Instructor モデルの指定されたプロパティのみがバインドされます。In the following example, only the specified properties of the Instructor model are bound when the OnPost method is called:

[HttpPost]
public IActionResult OnPost([Bind("LastName,FirstMidName,HireDate")] Instructor instructor)

[Bind] 属性を使用すれば、"作成" シナリオにおいて過剰ポスティングから保護することができます。The [Bind] attribute can be used to protect against overposting in create scenarios. 除外されたプロパティはそのままにしておくのではなく null または既定値に設定されるので、この属性は編集シナリオではうまく機能しません。It doesn't work well in edit scenarios because excluded properties are set to null or a default value instead of being left unchanged. 過剰ポスティングを防ぐ場合は、[Bind] 属性ではなくビュー モデルをお勧めします。For defense against overposting, view models are recommended rather than the [Bind] attribute. 詳細については、「過剰ポスティングに関するセキュリティの注意事項」を参照してください。For more information, see Security note about overposting.

コレクションCollections

ターゲットが単純型のコレクションである場合、モデル バインドでは parameter_name または property_name との一致が探索されます。For targets that are collections of simple types, model binding looks for matches to parameter_name or property_name. 一致が見つからない場合は、サポートされているいずれかの形式がプレフィックスなしで探索されます。If no match is found, it looks for one of the supported formats without the prefix. 例:For example:

  • バインドされるパラメーターが selectedCourses という名前の配列であるとした場合: Suppose the parameter to be bound is an array named selectedCourses:

    public IActionResult OnPost(int? id, int[] selectedCourses)
    
  • フォームまたはクエリ文字列データは、次のいずれかの形式とすることができます。Form or query string data can be in one of the following formats:

    selectedCourses=1050&selectedCourses=2000 
    
    selectedCourses[0]=1050&selectedCourses[1]=2000
    
    [0]=1050&[1]=2000
    
    selectedCourses[a]=1050&selectedCourses[b]=2000&selectedCourses.index=a&selectedCourses.index=b
    
    [a]=1050&[b]=2000&index=a&index=b
    
  • 次の形式は、フォーム データでのみサポートされます。The following format is supported only in form data:

    selectedCourses[]=1050&selectedCourses[]=2000
    
  • 上記のすべてのフォーマット例において、モデル バインドでは 2 つの項目から成る配列が selectedCourses パラメーターに渡されます。For all of the preceding example formats, model binding passes an array of two items to the selectedCourses parameter:

    • selectedCourses[0]=1050selectedCourses[0]=1050
    • selectedCourses[1]=2000selectedCourses[1]=2000

    添え字番号 (... [0] ... [1] ...) を使用するデータ フォーマットでは、確実にそれらがゼロから始まる連続した番号になるようにする必要があります。Data formats that use subscript numbers (... [0] ... [1] ...) must ensure that they are numbered sequentially starting at zero. 添え字の番号付けで欠落している番号がある場合、欠落している番号の後の項目はすべて無視されます。If there are any gaps in subscript numbering, all items after the gap are ignored. たとえば、添え字が 0、1 の並びではなく、0、2 の並びで振られている場合、2 番目の項目は無視されます。For example, if the subscripts are 0 and 2 instead of 0 and 1, the second item is ignored.

ディクショナリDictionaries

Dictionary ターゲットの場合、モデル バインドでは parameter_name または property_name との一致が探索されます。For Dictionary targets, model binding looks for matches to parameter_name or property_name. 一致が見つからない場合は、サポートされているいずれかの形式がプレフィックスなしで探索されます。If no match is found, it looks for one of the supported formats without the prefix. 例:For example:

  • ターゲット パラメーターが selectedCourses という名前の Dictionary<int, string> であるとします: Suppose the target parameter is a Dictionary<int, string> named selectedCourses:

    public IActionResult OnPost(int? id, Dictionary<int, string> selectedCourses)
    
  • ポストされたフォームまたはクエリ文字列データは、次のいずれかの例のようになります。The posted form or query string data can look like one of the following examples:

    selectedCourses[1050]=Chemistry&selectedCourses[2000]=Economics
    
    [1050]=Chemistry&selectedCourses[2000]=Economics
    
    selectedCourses[0].Key=1050&selectedCourses[0].Value=Chemistry&
    selectedCourses[1].Key=2000&selectedCourses[1].Value=Economics
    
    [0].Key=1050&[0].Value=Chemistry&[1].Key=2000&[1].Value=Economics
    
  • 上記のすべてのフォーマット例において、モデル バインドでは 2 つの項目から成る辞書が selectedCourses パラメーターに渡されます。For all of the preceding example formats, model binding passes a dictionary of two items to the selectedCourses parameter:

    • selectedCourses["1050"]="Chemistry"selectedCourses["1050"]="Chemistry"
    • selectedCourses["2000"]="Economics"selectedCourses["2000"]="Economics"

モデル バインド ルート データとクエリ文字列のグローバリゼーション動作Globalization behavior of model binding route data and query strings

ASP.NET Core ルート値プロバイダーとクエリ文字列値プロバイダーでは、次のことが行われます。The ASP.NET Core route value provider and query string value provider:

  • 値をインバリアント カルチャとして扱います。Treat values as invariant culture.
  • URL はカルチャに依存しないものと想定します。Expect that URLs are culture-invariant.

これに対し、フォーム データからの値は、カルチャに依存した変換にかけられます。In contrast, values coming from form data undergo a culture-sensitive conversion. URL がロケール間で共有可能なように、設計上そのようになっています。This is by design so that URLs are shareable across locales.

ASP.NET Core ルート値プロバイダーとクエリ文字列値プロバイダーでカルチャ依存の変換が行われるようにするには、次のようにします。To make the ASP.NET Core route value provider and query string value provider undergo a culture-sensitive conversion:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews(options =>
    {
        var index = options.ValueProviderFactories.IndexOf(
            options.ValueProviderFactories.OfType<QueryStringValueProviderFactory>().Single());
        options.ValueProviderFactories[index] = new CulturedQueryStringValueProviderFactory();
    });
}
public class CulturedQueryStringValueProviderFactory : IValueProviderFactory
{
    public Task CreateValueProviderAsync(ValueProviderFactoryContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }

        var query = context.ActionContext.HttpContext.Request.Query;
        if (query != null && query.Count > 0)
        {
            var valueProvider = new QueryStringValueProvider(
                BindingSource.Query,
                query,
                CultureInfo.CurrentCulture);

            context.ValueProviders.Add(valueProvider);
        }

        return Task.CompletedTask;
    }
}

特別なデータ型Special data types

モデル バインドで処理できる特殊なデータ型がいくつかあります。There are some special data types that model binding can handle.

IFormFile と IFormFileCollectionIFormFile and IFormFileCollection

HTTP 要求に含まれたアップロード済みファイル。An uploaded file included in the HTTP request. また、複数のファイルに対して IEnumerable<IFormFile> もサポートされています。Also supported is IEnumerable<IFormFile> for multiple files.

CancellationTokenCancellationToken

非同期コントローラーでアクティビティをキャンセルするために使用されます。Used to cancel activity in asynchronous controllers.

FormCollectionFormCollection

ポストされたフォーム データからすべての値を取得するために使用します。Used to retrieve all the values from posted form data.

入力フォーマッタInput formatters

要求本文内のデータは、JSON、XML、またはその他のいくつかの形式にすることができます。Data in the request body can be in JSON, XML, or some other format. このデータを解析するために、モデル バインドでは、特定のコンテンツの種類を処理するように構成された "入力フォーマッタ" が使用されます。To parse this data, model binding uses an input formatter that is configured to handle a particular content type. 既定では、ASP.NET Core には JSON データ処理用の JSON ベースの入力フォーマッタが含まれます。By default, ASP.NET Core includes JSON based input formatters for handling JSON data. 他のコンテンツの種類については対応する他のフォーマッタを追加することができます。You can add other formatters for other content types.

ASP.NET Core では、Consumes 属性に基づいて入力フォーマッタが選択されます。ASP.NET Core selects input formatters based on the Consumes attribute. 属性が存在しない場合は、Content-Type ヘッダーが使用されます。If no attribute is present, it uses the Content-Type header.

組み込みの XML 入力フォーマッタを使用するには: To use the built-in XML input formatters:

  • Microsoft.AspNetCore.Mvc.Formatters.Xml NuGet パッケージをインストールします。Install the Microsoft.AspNetCore.Mvc.Formatters.Xml NuGet package.

  • Startup.ConfigureServices で、AddXmlSerializerFormatters または AddXmlDataContractSerializerFormatters を呼び出します。In Startup.ConfigureServices, call AddXmlSerializerFormatters or AddXmlDataContractSerializerFormatters.

    services.AddRazorPages()
        .AddMvcOptions(options =>
    {
        options.ValueProviderFactories.Add(new CookieValueProviderFactory());
        options.ModelMetadataDetailsProviders.Add(
            new ExcludeBindingMetadataProvider(typeof(System.Version)));
        options.ModelMetadataDetailsProviders.Add(
            new SuppressChildValidationMetadataProvider(typeof(System.Guid)));
    })
    .AddXmlSerializerFormatters();
    
  • 要求本文で XML を必要とするコントローラー クラスまたはアクション メソッドに Consumes 属性を適用します。Apply the Consumes attribute to controller classes or action methods that should expect XML in the request body.

    [HttpPost]
    [Consumes("application/xml")]
    public ActionResult<Pet> Create(Pet pet)
    

    詳細については、「XML シリアル化の概要」を参照してください。For more information, see Introducing XML Serialization.

入力フォーマッタを使用してモデル バインドをカスタマイズするCustomize model binding with input formatters

入力フォーマッタは、要求本文からデータを読み取るためのすべての役割を担います。An input formatter takes full responsibility for reading data from the request body. このプロセスをカスタマイズするには、入力フォーマッタによって使用される API を構成します。To customize this process, configure the APIs used by the input formatter. このセクションでは、ObjectId という名前のカスタム型を理解するために、System.Text.Json ベースの入力フォーマッタをカスタマイズする方法について説明します。This section describes how to customize the System.Text.Json-based input formatter to understand a custom type named ObjectId.

Id という名前のカスタム ObjectId プロパティが含まれている、次のモデルを考えてみます。Consider the following model, which contains a custom ObjectId property named Id:

public class ModelWithObjectId
{
    public ObjectId Id { get; set; }
}

System.Text.Json を使用する際のモデル バインド プロセスをカスタマイズするために、JsonConverter<T> から派生するクラスを作成します。To customize the model binding process when using System.Text.Json, create a class derived from JsonConverter<T>:

internal class ObjectIdConverter : JsonConverter<ObjectId>
{
    public override ObjectId Read(
        ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return new ObjectId(JsonSerializer.Deserialize<int>(ref reader, options));
    }

    public override void Write(
        Utf8JsonWriter writer, ObjectId value, JsonSerializerOptions options)
    {
        writer.WriteNumberValue(value.Id);
    }
}

カスタム コンバーターを使用するために、型に JsonConverterAttribute 属性を適用します。To use a custom converter, apply the JsonConverterAttribute attribute to the type. 次の例では、ObjectId 型は、ObjectIdConverter をそのカスタム コンバーターとして構成されています。In the following example, the ObjectId type is configured with ObjectIdConverter as its custom converter:

[JsonConverter(typeof(ObjectIdConverter))]
public struct ObjectId
{
    public ObjectId(int id) =>
        Id = id;

    public int Id { get; }
}

詳細については、カスタム コンバーターを記述する方法に関する記事をご覧ください。For more information, see How to write custom converters.

指定された型をモデル バインドから除外するExclude specified types from model binding

モデル バインドおよび検証システムの動作は、ModelMetadata によって駆動されます。The model binding and validation systems' behavior is driven by ModelMetadata. ModelMetadata については、詳細プロバイダーを MvcOptions.ModelMetadataDetailsProviders に追加してカスタマイズできます。You can customize ModelMetadata by adding a details provider to MvcOptions.ModelMetadataDetailsProviders. 組み込みの詳細プロバイダーは、指定された型に対してモデル バインドまたは検証を無効にする場合に使用できます。Built-in details providers are available for disabling model binding or validation for specified types.

指定された型のすべてのモデルに対してモデル バインドを無効にするには、Startup.ConfigureServicesExcludeBindingMetadataProvider を追加します。To disable model binding on all models of a specified type, add an ExcludeBindingMetadataProvider in Startup.ConfigureServices. たとえば、System.Version 型のすべてのモデルに対してモデル バインドを無効にするには、次のようにします。For example, to disable model binding on all models of type System.Version:

services.AddRazorPages()
    .AddMvcOptions(options =>
{
    options.ValueProviderFactories.Add(new CookieValueProviderFactory());
    options.ModelMetadataDetailsProviders.Add(
        new ExcludeBindingMetadataProvider(typeof(System.Version)));
    options.ModelMetadataDetailsProviders.Add(
        new SuppressChildValidationMetadataProvider(typeof(System.Guid)));
})
.AddXmlSerializerFormatters();

指定された型のプロパティに対して検証を無効にするには、Startup.ConfigureServicesSuppressChildValidationMetadataProvider を追加します。To disable validation on properties of a specified type, add a SuppressChildValidationMetadataProvider in Startup.ConfigureServices. たとえば、System.Guid 型のプロパティに対して検証を無効にするには、次のようにします。For example, to disable validation on properties of type System.Guid:

services.AddRazorPages()
    .AddMvcOptions(options =>
{
    options.ValueProviderFactories.Add(new CookieValueProviderFactory());
    options.ModelMetadataDetailsProviders.Add(
        new ExcludeBindingMetadataProvider(typeof(System.Version)));
    options.ModelMetadataDetailsProviders.Add(
        new SuppressChildValidationMetadataProvider(typeof(System.Guid)));
})
.AddXmlSerializerFormatters();

カスタム モデル バインダーCustom model binders

モデル バインドを拡張するには、カスタム モデル バインダーを記述し、[ModelBinder] 属性を使用してそれを特定のターゲット向けに選択します。You can extend model binding by writing a custom model binder and using the [ModelBinder] attribute to select it for a given target. 詳細については、「custom model binding」 (カスタム モデル バインド) を参照してください。Learn more about custom model binding.

手動によるモデル バインドManual model binding

モデル バインドは、TryUpdateModelAsync メソッドを使用して手動で呼び出すことができます。Model binding can be invoked manually by using the TryUpdateModelAsync method. このメソッドは ControllerBase クラスと PageModel クラスの両方で定義されています。The method is defined on both ControllerBase and PageModel classes. メソッドのオーバーロードにより、使用するプレフィックスと値プロバイダーを指定できます。Method overloads let you specify the prefix and value provider to use. モデル バインドが失敗した場合は、メソッドから false が返されます。The method returns false if model binding fails. 次に例を示します。Here's an example:

if (await TryUpdateModelAsync<InstructorWithCollection>(
    newInstructor,
    "Instructor",
    i => i.FirstMidName, i => i.LastName, i => i.HireDate))
{
    _instructorsInMemoryStore.Add(newInstructor);
    return RedirectToPage("./Index");
}
PopulateAssignedCourseData(newInstructor);
return Page();

TryUpdateModelAsync では、フォーム本文、クエリ文字列、およびルート データからデータを取得するために、値プロバイダーが使用されます。TryUpdateModelAsync uses value providers to get data from the form body, query string, and route data. TryUpdateModelAsync は通常、次のようになります。TryUpdateModelAsync is typically:

  • Razor過剰ポストを防ぐために、コントローラーとビューを使用してページおよび MVC アプリで使用します。Used with Razor Pages and MVC apps using controllers and views to prevent over-posting.
  • フォーム データ、クエリ文字列、およびルート データから使用される場合を除き、Web API では使用されません。Not used with a web API unless consumed from form data, query strings, and route data. JSON を使用する Web API エンドポイントでは、入力フォーマッタを使用して要求本文がオブジェクトに逆シリアル化されます。Web API endpoints that consume JSON use Input formatters to deserialize the request body into an object.

詳細については、「TryUpdateModelAsync」をご覧ください。For more information, see TryUpdateModelAsync.

[FromServices] 属性[FromServices] attribute

この属性の名前は、データ ソースを指定するモデル バインド属性のパターンに従います。This attribute's name follows the pattern of model binding attributes that specify a data source. ただし、それは、値プロバイダーからのデータ バインドを説明するものではありません。But it's not about binding data from a value provider. 依存関係挿入コンテナーから型のインスタンスが取得されます。It gets an instance of a type from the dependency injection container. その目的は、特定のメソッドが呼び出された場合にのみサービスを必要するときにコンストラクターの挿入の代替手段を提供することにあります。Its purpose is to provide an alternative to constructor injection for when you need a service only if a particular method is called.

その他のリソースAdditional resources

この記事では、モデル バインドとは何か、そのしくみ、その動作のカスタマイズ方法を説明します。This article explains what model binding is, how it works, and how to customize its behavior.

サンプル コードを表示またはダウンロードします (ダウンロード方法)。View or download sample code (how to download).

モデル バインドとは何かWhat is Model binding

コントローラーと Razor ページは、HTTP 要求から取得されたデータを処理します。Controllers and Razor pages work with data that comes from HTTP requests. たとえば、ルート データからはレコード キーが提供され、ポストされたフォーム フィールドからはモデルのプロパティ用の値が提供されます。For example, route data may provide a record key, and posted form fields may provide values for the properties of the model. これらの各値を取得してそれらを文字列から .NET 型に変換するためのコードを記述するのは、面倒で間違いも起こりやすいでしょう。Writing code to retrieve each of these values and convert them from strings to .NET types would be tedious and error-prone. モデル バインドを使用すれば、このプロセスを自動化できます。Model binding automates this process. モデル バインド システムでは次のことが行われます。The model binding system:

  • ルート データ、フォーム フィールド、クエリ文字列などのさまざまなソースからデータを取得します。Retrieves data from various sources such as route data, form fields, and query strings.
  • Razorメソッドパラメーターおよびパブリックプロパティのデータをコントローラーおよびページに提供します。Provides the data to controllers and Razor pages in method parameters and public properties.
  • 文字列データを .NET 型に変換します。Converts string data to .NET types.
  • 複合型のプロパティを更新します。Updates properties of complex types.

Example

次のアクション メソッドがあるとします。Suppose you have the following action method:

[HttpGet("{id}")]
public ActionResult<Pet> GetById(int id, bool dogsOnly)

さらにアプリでは、この URL を使用して要求が受信されます。And the app receives a request with this URL:

http://contoso.com/api/pets/2?DogsOnly=true

ルーティング システムでアクション メソッドが選択されたら、モデル バインドでは次の手順が実行されます。Model binding goes through the following steps after the routing system selects the action method:

  • GetByID の最初のパラメーター (id という名前の整数型) を検索します。Finds the first parameter of GetByID, an integer named id.
  • HTTP 要求内で利用可能なソースを調べ、ルート データ内で id = "2" を検索します。Looks through the available sources in the HTTP request and finds id = "2" in route data.
  • 文字列 "2" を整数 2 に変換します。Converts the string "2" into integer 2.
  • GetByID の次のパラメーター (dogsOnly という名前のブール型) を検索します。Finds the next parameter of GetByID, a boolean named dogsOnly.
  • 該当するソース内を調べ、クエリ文字列内で "DogsOnly=true" を検索します。Looks through the sources and finds "DogsOnly=true" in the query string. 名前の照合では大文字と小文字が区別されません。Name matching is not case-sensitive.
  • 文字列 "true" をブール型の true に変換します。Converts the string "true" into boolean true.

次にフレームワークによって GetById メソッドが呼び出され、id パラメーターには 2 が、dogsOnly パラメーターには true が渡されます。The framework then calls the GetById method, passing in 2 for the id parameter, and true for the dogsOnly parameter.

上記の例で、モデル バインディング ターゲットは単純型のメソッド パラメーターになっています。In the preceding example, the model binding targets are method parameters that are simple types. ターゲットは複合型のプロパティになる場合もあります。Targets may also be the properties of a complex type. 各プロパティが正常にバインドされたら、そのプロパティに対してモデル検証が行われます。After each property is successfully bound, model validation occurs for that property. どのようなデータがモデルにバインドされているかを示す記録、バインド エラー、または検証のエラーは、ControllerBase.ModelState または PageModel.ModelState に格納されます。The record of what data is bound to the model, and any binding or validation errors, is stored in ControllerBase.ModelState or PageModel.ModelState. このプロセスが正常終了したかどうかを確認するために、アプリでは ModelState.IsValid フラグが調べられます。To find out if this process was successful, the app checks the ModelState.IsValid flag.

ターゲットTargets

モデル バインドでは、次の種類のターゲットの値について検索が試みられます。Model binding tries to find values for the following kinds of targets:

  • 要求のルーティング先であるコントローラー アクション メソッドのパラメーター。Parameters of the controller action method that a request is routed to.
  • Razor要求がルーティングされるページハンドラーメソッドのパラメーター。Parameters of the Razor Pages handler method that a request is routed to.
  • 属性によって指定されている場合は、コントローラーまたは PageModel クラスのパブリック プロパティ。Public properties of a controller or PageModel class, if specified by attributes.

[BindProperty] 属性[BindProperty] attribute

コントローラーまたは PageModel クラスのパブリック プロパティに適用できます。これによってモデル バインドはそのプロパティをターゲットとするようになります。Can be applied to a public property of a controller or PageModel class to cause model binding to target that property:

public class EditModel : InstructorsPageModel
{
    [BindProperty]
    public Instructor Instructor { get; set; }

[BindProperties] 属性[BindProperties] attribute

ASP.NET Core 2.1 以降で使用できます。Available in ASP.NET Core 2.1 and later. コントローラーまたは PageModel クラスに適用できます。これによってモデル バインドはクラスのすべてのパブリック プロパティをターゲットとするように指示されます。Can be applied to a controller or PageModel class to tell model binding to target all public properties of the class:

[BindProperties(SupportsGet = true)]
public class CreateModel : InstructorsPageModel
{
    public Instructor Instructor { get; set; }

HTTP GET 要求のモデル バインドModel binding for HTTP GET requests

既定では、プロパティは HTTP GET 要求にバインドされません。By default, properties are not bound for HTTP GET requests. 通常、GET 要求に必要なのはレコード ID パラメーターのみです。Typically, all you need for a GET request is a record ID parameter. レコード ID は、データベース内の項目の検索に使用されます。The record ID is used to look up the item in the database. そのため、モデルのインスタンスを保持するプロパティをバインドする必要はありません。Therefore, there is no need to bind a property that holds an instance of the model. GET 要求からのデータにプロパティがバインドされるようにするシナリオでは、SupportsGet プロパティを true に設定します。In scenarios where you do want properties bound to data from GET requests, set the SupportsGet property to true:

[BindProperty(Name = "ai_user", SupportsGet = true)]
public string ApplicationInsightsCookie { get; set; }

ソースSources

既定では、モデル バインドでは HTTP 要求内の次のソースからキーと値のペアの形式でデータが取得されます。By default, model binding gets data in the form of key-value pairs from the following sources in an HTTP request:

  1. フォーム フィールドForm fields
  2. 要求本文 ([ApiController] 属性を持つコントローラー の場合)。The request body (For controllers that have the [ApiController] attribute.)
  3. ルート データRoute data
  4. クエリ文字列パラメーターQuery string parameters
  5. アップロード済みのファイルUploaded files

ターゲット パラメーターまたはプロパティごとに、前述の一覧に示されている順序でソースがスキャンされます。For each target parameter or property, the sources are scanned in the order indicated in the preceding list. 次のようにいくつかの例外があります。There are a few exceptions:

  • ルート データとクエリ文字列の値は単純型にのみ使用されます。Route data and query string values are used only for simple types.
  • アップロード済みのファイルは、IFormFile または IEnumerable<IFormFile> を実装するターゲットの種類にのみバインドされます。Uploaded files are bound only to target types that implement IFormFile or IEnumerable<IFormFile>.

既定のソースが正しくない場合は、次のいずれかの属性を使用してソースを指定します。If the default source is not correct, use one of the following attributes to specify the source:

  • [FromQuery]-クエリ文字列から値を取得します。[FromQuery] - Gets values from the query string.
  • [FromRoute]-ルートデータから値を取得します。[FromRoute] - Gets values from route data.
  • [FromForm]-ポストされたフォームフィールドから値を取得します。[FromForm] - Gets values from posted form fields.
  • [FromBody]-要求本文から値を取得します。[FromBody] - Gets values from the request body.
  • [FromHeader]-HTTP ヘッダーから値を取得します。[FromHeader] - Gets values from HTTP headers.

これらの属性: These attributes:

  • 次の例のように、(モデル クラスにではなく) モデル プロパティに個別に追加されます。Are added to model properties individually (not to the model class), as in the following example:

    public class Instructor
    {
        public int ID { get; set; }
    
        [FromQuery(Name = "Note")]
        public string NoteFromQueryString { get; set; }
    
  • 必要に応じて、コンストラクター内のモデル名の値を受け取ります。Optionally accept a model name value in the constructor. このオプションは、プロパティ名と要求内の値とが一致しない場合に指定されます。This option is provided in case the property name doesn't match the value in the request. たとえば、要求内の値は、次の例のようにその名前にハイフンが含まれている場合、ヘッダーである可能性があります。For instance, the value in the request might be a header with a hyphen in its name, as in the following example:

    public void OnGet([FromHeader(Name = "Accept-Language")] string language)
    

[FromBody] 属性[FromBody] attribute

[FromBody] 属性をパラメーターに適用すると、HTTP 要求の本文からそのプロパティが設定されます。Apply the [FromBody] attribute to a parameter to populate its properties from the body of an HTTP request. ASP.NET Core ランタイムでは、本文を読み取る責任が入力フォーマッタに委任されます。The ASP.NET Core runtime delegates the responsibility of reading the body to an input formatter. 入力フォーマッタについては、この記事で後ほど説明します。Input formatters are explained later in this article.

[FromBody] を複合型パラメーターに適用すると、そのプロパティに適用されているバインディング ソース属性はいずれも無視されます。When [FromBody] is applied to a complex type parameter, any binding source attributes applied to its properties are ignored. たとえば、次の Create アクションでは、その pet パラメーターを本文から設定するように指定されています。For example, the following Create action specifies that its pet parameter is populated from the body:

public ActionResult<Pet> Create([FromBody] Pet pet)

Pet クラスでは、Breed プロパティをクエリ文字列パラメーターから設定するように指定されています。The Pet class specifies that its Breed property is populated from a query string parameter:

public class Pet
{
    public string Name { get; set; }

    [FromQuery] // Attribute is ignored.
    public string Breed { get; set; }
}

前の例の場合:In the preceding example:

  • [FromQuery] 属性は無視されます。The [FromQuery] attribute is ignored.
  • Breed プロパティは、クエリ文字列パラメーターから設定されません。The Breed property is not populated from a query string parameter.

入力フォーマッタでは本文のみが読み取られ、バインディング ソース属性は認識されません。Input formatters read only the body and don't understand binding source attributes. 本文内で適切な値が見つかった場合は、その値を使用して Breed プロパティが設定されます。If a suitable value is found in the body, that value is used to populate the Breed property.

アクション メソッドごとに [FromBody] を複数のパラメーターに適用しないでください。Don't apply [FromBody] to more than one parameter per action method. 入力フォーマッタによって要求ストリームが読み取られると、他の [FromBody] パラメーターをバインドするためにそれを再度読み取ることはできません。Once the request stream is read by an input formatter, it's no longer available to be read again for binding other [FromBody] parameters.

その他のソースAdditional sources

ソース データは、"値プロバイダー" によってモデル バインド システムに提供されます。Source data is provided to the model binding system by value providers. モデル バインド用に、他のソースからデータを取得するカスタムの値プロバイダーを作成して登録することができます。You can write and register custom value providers that get data for model binding from other sources. たとえば、またはセッション状態のデータが必要になる場合があり cookie ます。For example, you might want data from cookies or session state. 新しいソースからデータを取得するには: To get data from a new source:

  • IValueProvider を実装するクラスを作成します。Create a class that implements IValueProvider.
  • IValueProviderFactory を実装するクラスを作成します。Create a class that implements IValueProviderFactory.
  • Startup.ConfigureServices 内のファクトリ クラスを登録します。Register the factory class in Startup.ConfigureServices.

サンプルアプリには、s から値を取得する値プロバイダーファクトリの例が含まれてい cookie ます。The sample app includes a value provider and factory example that gets values from cookies. Startup.ConfigureServices 内の登録コードを次に示します。Here's the registration code in Startup.ConfigureServices:

services.AddMvc(options =>
{
    options.ValueProviderFactories.Add(new CookieValueProviderFactory());
    options.ModelMetadataDetailsProviders.Add(
        new ExcludeBindingMetadataProvider(typeof(System.Version)));
    options.ModelMetadataDetailsProviders.Add(
        new SuppressChildValidationMetadataProvider(typeof(System.Guid)));
})
.AddXmlSerializerFormatters()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

表示したコードでは、すべての組み込み値プロバイダーの後にカスタムの値プロバイダーが配置されています。The code shown puts the custom value provider after all the built-in value providers. それをリストの最初に持ってくるには、Add ではなく Insert(0, new CookieValueProviderFactory()) を呼び出します。To make it the first in the list, call Insert(0, new CookieValueProviderFactory()) instead of Add.

モデル プロパティ用のソースがないNo source for a model property

既定では、モデル プロパティ用の値が見つからない場合、モデル状態エラーは作成されません。By default, a model state error isn't created if no value is found for a model property. プロパティは次のように null 値または既定値に設定されます。The property is set to null or a default value:

  • null 許容単純型は null に設定されます。Nullable simple types are set to null.
  • null 非許容値型は default(T) に設定されます。Non-nullable value types are set to default(T). たとえば、パラメーター int id は 0 に設定されます。For example, a parameter int id is set to 0.
  • 複合型の場合、モデル バインドでは、プロパティを設定せずに既定のコンストラクターを使用して、インスタンスが作成されます。For complex Types, model binding creates an instance by using the default constructor, without setting properties.
  • 配列は Array.Empty<T>() に設定されます。例外として、byte[] 配列は null に設定されます。Arrays are set to Array.Empty<T>(), except that byte[] arrays are set to null.

モデルプロパティのフォームフィールドに何も見つからない場合にモデルの状態を無効にする必要がある場合は、属性を使用し [BindRequired] ます。If model state should be invalidated when nothing is found in form fields for a model property, use the [BindRequired] attribute.

この [BindRequired] 動作は、要求本文内の JSON または XML データに対してではなく、ポストされたフォーム データからのモデル バインドに適用されることに注意してください。Note that this [BindRequired] behavior applies to model binding from posted form data, not to JSON or XML data in a request body. 要求本文データは、入力フォーマッタによって処理されます。Request body data is handled by input formatters.

型変換エラーType conversion errors

ソースは見つかってもそれをターゲットの種類に変換できない場合、無効であることを示すフラグがモデル状態に付けられます。If a source is found but can't be converted into the target type, model state is flagged as invalid. 前のセクションで説明したように、ターゲットのパラメーターまたはプロパティは null または既定値に設定されます。The target parameter or property is set to null or a default value, as noted in the previous section.

[ApiController] 属性を持つ API コントローラーでは、モデル状態が無効であると、HTTP 400 の自動応答が生成されます。In an API controller that has the [ApiController] attribute, invalid model state results in an automatic HTTP 400 response.

ページで、次のエラーメッセージが表示さ Razor れたページを再び表示します。In a Razor page, redisplay the page with an error message:

public IActionResult OnPost()
{
    if (!ModelState.IsValid)
    {
        return Page();
    }

    _instructorsInMemoryStore.Add(Instructor);
    return RedirectToPage("./Index");
}

クライアント側の検証では、ページフォームに送信される可能性のあるほとんどの不適切なデータをキャッチ Razor します。Client-side validation catches most bad data that would otherwise be submitted to a Razor Pages form. この検証により、前の強調表示されたコードをトリガーするのが難しくなります。This validation makes it hard to trigger the preceding highlighted code. サンプル アプリには、[Submit with Invalid Date] ボタンが含まれており、これを使用すると、[Hire Date] フィールドに不適切なデータが入力され、そのフォームが送信されます。The sample app includes a Submit with Invalid Date button that puts bad data in the Hire Date field and submits the form. このボタンを使用すると、データ変換エラーが発生したときにページを再表示するためのコードがどのように機能するかを表示できます。This button shows how the code for redisplaying the page works when data conversion errors occur.

上のコードでページが再表示されると、無効な入力はフォーム フィールドに表示されません。When the page is redisplayed by the preceding code, the invalid input is not shown in the form field. これは、モデル プロパティが null または既定値に設定されているためです。This is because the model property has been set to null or a default value. 無効な入力はエラー メッセージに表示されます。The invalid input does appear in an error message. しかし、フォーム フィールドに不適切なデータを再表示したい場合は、モデル プロパティを文字列にしてデータ変換を手動で行うことを検討してください。But if you want to redisplay the bad data in the form field, consider making the model property a string and doing the data conversion manually.

型変換エラーが結果的にモデル状態エラーになることを望まない場合も同じ方法をお勧めします。The same strategy is recommended if you don't want type conversion errors to result in model state errors. その場合は、モデル プロパティを文字列にします。In that case, make the model property a string.

単純型Simple types

モデル バインダーでソース文字列の変換先とすることができる単純型には次のものがあります。The simple types that the model binder can convert source strings into include the following:

複合型Complex types

複合型には、バインドする既定のパブリック コンストラクターと書き込み可能なパブリック プロパティが必要です。A complex type must have a public default constructor and public writable properties to bind. モデル バインドが行われると、クラスは既定のパブリック コンストラクターを使用してインスタンス化されます。When model binding occurs, the class is instantiated using the public default constructor.

複合型のプロパティごとに、モデル バインドでは名前パターン prefix.property_name がないかソースが調べられます。For each property of the complex type, model binding looks through the sources for the name pattern prefix.property_name. 何も見つからない場合は、プレフィックスなしで property_name だけが探索されます。If nothing is found, it looks for just property_name without the prefix.

パラメーターにバインドする場合、プレフィックスはパラメーター名です。For binding to a parameter, the prefix is the parameter name. PageModel パブリック プロパティにバインドする場合、プレフィックスはパブリック プロパティ名です。For binding to a PageModel public property, the prefix is the public property name. 一部の属性には、パラメーター名またはプロパティ名の既定の使用をオーバーライドするための Prefix プロパティがあります。Some attributes have a Prefix property that lets you override the default usage of parameter or property name.

たとえば、複合型が次の Instructor クラスであるとします。For example, suppose the complex type is the following Instructor class:

public class Instructor
{
    public int ID { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
}

プレフィックス = パラメーター名Prefix = parameter name

バインドされるモデルが instructorToUpdate という名前のパラメーターである場合: If the model to be bound is a parameter named instructorToUpdate:

public IActionResult OnPost(int? id, Instructor instructorToUpdate)

モデル バインドでは、キー instructorToUpdate.ID がないかソースを調べることから始まります。Model binding starts by looking through the sources for the key instructorToUpdate.ID. 見つからない場合は、プレフィックスなしで ID が探索されます。If that isn't found, it looks for ID without a prefix.

プレフィックス = プロパティ名Prefix = property name

バインドされるモデルがコントローラーの Instructor という名前のプロパティか、または PageModel クラスである場合: If the model to be bound is a property named Instructor of the controller or PageModel class:

[BindProperty]
public Instructor Instructor { get; set; }

モデル バインドでは、キー Instructor.ID がないかソースを調べることから始まります。Model binding starts by looking through the sources for the key Instructor.ID. 見つからない場合は、プレフィックスなしで ID が探索されます。If that isn't found, it looks for ID without a prefix.

カスタム プレフィックスCustom prefix

バインドされるモデルが instructorToUpdate という名前のパラメーターであり、かつ Bind 属性でプレフィックスとして Instructor が指定されている場合: If the model to be bound is a parameter named instructorToUpdate and a Bind attribute specifies Instructor as the prefix:

public IActionResult OnPost(
    int? id, [Bind(Prefix = "Instructor")] Instructor instructorToUpdate)

モデル バインドでは、キー Instructor.ID がないかソースを調べることから始まります。Model binding starts by looking through the sources for the key Instructor.ID. 見つからない場合は、プレフィックスなしで ID が探索されます。If that isn't found, it looks for ID without a prefix.

複合型のターゲットの属性Attributes for complex type targets

複合型のモデル バインドを制御するために利用できる組み込みの属性がいくつかあります。Several built-in attributes are available for controlling model binding of complex types:

  • [BindRequired]
  • [BindNever]
  • [Bind]

注意

ポストされたフォーム データが値のソースである場合、これらの属性はモデル バインドに影響します。These attributes affect model binding when posted form data is the source of values. ポストされた JSON および XML 要求本文を処理する入力フォーマッタには影響しません。They do not affect input formatters, which process posted JSON and XML request bodies. 入力フォーマッタについては、この記事で後ほど説明します。Input formatters are explained later in this article.

モデル検証に関するページにある [Required] 属性の説明も参照してください。See also the discussion of the [Required] attribute in Model validation.

[BindRequired] 属性[BindRequired] attribute

モデルのプロパティにのみに適用でき、メソッドのパラメーターには適用できません。Can only be applied to model properties, not to method parameters. モデルのプロパティに対してバインドを実行できない場合に、モデル バインドがモデル状態エラーを追加できるようにします。Causes model binding to add a model state error if binding cannot occur for a model's property. 次に例を示します。Here's an example:

public class InstructorWithCollection
{
    public int ID { get; set; }

    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    [Display(Name = "Hire Date")]
    [BindRequired]
    public DateTime HireDate { get; set; }

[BindNever] 属性[BindNever] attribute

モデルのプロパティにのみに適用でき、メソッドのパラメーターには適用できません。Can only be applied to model properties, not to method parameters. モデル バインドがモデルのプロパティを設定できないようにします。Prevents model binding from setting a model's property. 次に例を示します。Here's an example:

public class InstructorWithDictionary
{
    [BindNever]
    public int ID { get; set; }

[Bind] 属性[Bind] attribute

クラスまたはメソッド パラメーターに適用できます。Can be applied to a class or a method parameter. モデルのどのプロパティをモデル バインドに含めるかを指定します。Specifies which properties of a model should be included in model binding.

次の例では、任意のハンドラーまたはアクション メソッドが呼び出されると、Instructor モデルの指定されたプロパティのみがバインドされます。In the following example, only the specified properties of the Instructor model are bound when any handler or action method is called:

[Bind("LastName,FirstMidName,HireDate")]
public class Instructor

次の例では、OnPost メソッドが呼び出されると、Instructor モデルの指定されたプロパティのみがバインドされます。In the following example, only the specified properties of the Instructor model are bound when the OnPost method is called:

[HttpPost]
public IActionResult OnPost([Bind("LastName,FirstMidName,HireDate")] Instructor instructor)

[Bind] 属性を使用すれば、"作成" シナリオにおいて過剰ポスティングから保護することができます。The [Bind] attribute can be used to protect against overposting in create scenarios. 除外されたプロパティはそのままにしておくのではなく null または既定値に設定されるので、この属性は編集シナリオではうまく機能しません。It doesn't work well in edit scenarios because excluded properties are set to null or a default value instead of being left unchanged. 過剰ポスティングを防ぐ場合は、[Bind] 属性ではなくビュー モデルをお勧めします。For defense against overposting, view models are recommended rather than the [Bind] attribute. 詳細については、「過剰ポスティングに関するセキュリティの注意事項」を参照してください。For more information, see Security note about overposting.

コレクションCollections

ターゲットが単純型のコレクションである場合、モデル バインドでは parameter_name または property_name との一致が探索されます。For targets that are collections of simple types, model binding looks for matches to parameter_name or property_name. 一致が見つからない場合は、サポートされているいずれかの形式がプレフィックスなしで探索されます。If no match is found, it looks for one of the supported formats without the prefix. 例:For example:

  • バインドされるパラメーターが selectedCourses という名前の配列であるとした場合: Suppose the parameter to be bound is an array named selectedCourses:

    public IActionResult OnPost(int? id, int[] selectedCourses)
    
  • フォームまたはクエリ文字列データは、次のいずれかの形式とすることができます。Form or query string data can be in one of the following formats:

    selectedCourses=1050&selectedCourses=2000 
    
    selectedCourses[0]=1050&selectedCourses[1]=2000
    
    [0]=1050&[1]=2000
    
    selectedCourses[a]=1050&selectedCourses[b]=2000&selectedCourses.index=a&selectedCourses.index=b
    
    [a]=1050&[b]=2000&index=a&index=b
    
  • 次の形式は、フォーム データでのみサポートされます。The following format is supported only in form data:

    selectedCourses[]=1050&selectedCourses[]=2000
    
  • 上記のすべてのフォーマット例において、モデル バインドでは 2 つの項目から成る配列が selectedCourses パラメーターに渡されます。For all of the preceding example formats, model binding passes an array of two items to the selectedCourses parameter:

    • selectedCourses[0]=1050selectedCourses[0]=1050
    • selectedCourses[1]=2000selectedCourses[1]=2000

    添え字番号 (... [0] ... [1] ...) を使用するデータ フォーマットでは、確実にそれらがゼロから始まる連続した番号になるようにする必要があります。Data formats that use subscript numbers (... [0] ... [1] ...) must ensure that they are numbered sequentially starting at zero. 添え字の番号付けで欠落している番号がある場合、欠落している番号の後の項目はすべて無視されます。If there are any gaps in subscript numbering, all items after the gap are ignored. たとえば、添え字が 0、1 の並びではなく、0、2 の並びで振られている場合、2 番目の項目は無視されます。For example, if the subscripts are 0 and 2 instead of 0 and 1, the second item is ignored.

ディクショナリDictionaries

Dictionary ターゲットの場合、モデル バインドでは parameter_name または property_name との一致が探索されます。For Dictionary targets, model binding looks for matches to parameter_name or property_name. 一致が見つからない場合は、サポートされているいずれかの形式がプレフィックスなしで探索されます。If no match is found, it looks for one of the supported formats without the prefix. 例:For example:

  • ターゲット パラメーターが selectedCourses という名前の Dictionary<int, string> であるとします: Suppose the target parameter is a Dictionary<int, string> named selectedCourses:

    public IActionResult OnPost(int? id, Dictionary<int, string> selectedCourses)
    
  • ポストされたフォームまたはクエリ文字列データは、次のいずれかの例のようになります。The posted form or query string data can look like one of the following examples:

    selectedCourses[1050]=Chemistry&selectedCourses[2000]=Economics
    
    [1050]=Chemistry&selectedCourses[2000]=Economics
    
    selectedCourses[0].Key=1050&selectedCourses[0].Value=Chemistry&
    selectedCourses[1].Key=2000&selectedCourses[1].Value=Economics
    
    [0].Key=1050&[0].Value=Chemistry&[1].Key=2000&[1].Value=Economics
    
  • 上記のすべてのフォーマット例において、モデル バインドでは 2 つの項目から成る辞書が selectedCourses パラメーターに渡されます。For all of the preceding example formats, model binding passes a dictionary of two items to the selectedCourses parameter:

    • selectedCourses["1050"]="Chemistry"selectedCourses["1050"]="Chemistry"
    • selectedCourses["2000"]="Economics"selectedCourses["2000"]="Economics"

モデル バインド ルート データとクエリ文字列のグローバリゼーション動作Globalization behavior of model binding route data and query strings

ASP.NET Core ルート値プロバイダーとクエリ文字列値プロバイダーでは、次のことが行われます。The ASP.NET Core route value provider and query string value provider:

  • 値をインバリアント カルチャとして扱います。Treat values as invariant culture.
  • URL はカルチャに依存しないものと想定します。Expect that URLs are culture-invariant.

これに対し、フォーム データからの値は、カルチャに依存した変換にかけられます。In contrast, values coming from form data undergo a culture-sensitive conversion. URL がロケール間で共有可能なように、設計上そのようになっています。This is by design so that URLs are shareable across locales.

ASP.NET Core ルート値プロバイダーとクエリ文字列値プロバイダーでカルチャ依存の変換が行われるようにするには、次のようにします。To make the ASP.NET Core route value provider and query string value provider undergo a culture-sensitive conversion:

services.AddMvc(options =>
{
    var index = options.ValueProviderFactories.IndexOf(
        options.ValueProviderFactories.OfType<QueryStringValueProviderFactory>().Single());
    options.ValueProviderFactories[index] = new CulturedQueryStringValueProviderFactory();
});
public class CulturedQueryStringValueProviderFactory : IValueProviderFactory
{
    public Task CreateValueProviderAsync(ValueProviderFactoryContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }

        var query = context.ActionContext.HttpContext.Request.Query;
        if (query != null && query.Count > 0)
        {
            var valueProvider = new QueryStringValueProvider(
                BindingSource.Query,
                query,
                CultureInfo.CurrentCulture);

            context.ValueProviders.Add(valueProvider);
        }

        return Task.CompletedTask;
    }
}

特別なデータ型Special data types

モデル バインドで処理できる特殊なデータ型がいくつかあります。There are some special data types that model binding can handle.

IFormFile と IFormFileCollectionIFormFile and IFormFileCollection

HTTP 要求に含まれたアップロード済みファイル。An uploaded file included in the HTTP request. また、複数のファイルに対して IEnumerable<IFormFile> もサポートされています。Also supported is IEnumerable<IFormFile> for multiple files.

CancellationTokenCancellationToken

非同期コントローラーでアクティビティをキャンセルするために使用されます。Used to cancel activity in asynchronous controllers.

FormCollectionFormCollection

ポストされたフォーム データからすべての値を取得するために使用します。Used to retrieve all the values from posted form data.

入力フォーマッタInput formatters

要求本文内のデータは、JSON、XML、またはその他のいくつかの形式にすることができます。Data in the request body can be in JSON, XML, or some other format. このデータを解析するために、モデル バインドでは、特定のコンテンツの種類を処理するように構成された "入力フォーマッタ" が使用されます。To parse this data, model binding uses an input formatter that is configured to handle a particular content type. 既定では、ASP.NET Core には JSON データ処理用の JSON ベースの入力フォーマッタが含まれます。By default, ASP.NET Core includes JSON based input formatters for handling JSON data. 他のコンテンツの種類については対応する他のフォーマッタを追加することができます。You can add other formatters for other content types.

ASP.NET Core では、Consumes 属性に基づいて入力フォーマッタが選択されます。ASP.NET Core selects input formatters based on the Consumes attribute. 属性が存在しない場合は、Content-Type ヘッダーが使用されます。If no attribute is present, it uses the Content-Type header.

組み込みの XML 入力フォーマッタを使用するには: To use the built-in XML input formatters:

  • Microsoft.AspNetCore.Mvc.Formatters.Xml NuGet パッケージをインストールします。Install the Microsoft.AspNetCore.Mvc.Formatters.Xml NuGet package.

  • Startup.ConfigureServices で、AddXmlSerializerFormatters または AddXmlDataContractSerializerFormatters を呼び出します。In Startup.ConfigureServices, call AddXmlSerializerFormatters or AddXmlDataContractSerializerFormatters.

    services.AddMvc(options =>
    {
        options.ValueProviderFactories.Add(new CookieValueProviderFactory());
        options.ModelMetadataDetailsProviders.Add(
            new ExcludeBindingMetadataProvider(typeof(System.Version)));
        options.ModelMetadataDetailsProviders.Add(
            new SuppressChildValidationMetadataProvider(typeof(System.Guid)));
    })
    .AddXmlSerializerFormatters()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    
  • 要求本文で XML を必要とするコントローラー クラスまたはアクション メソッドに Consumes 属性を適用します。Apply the Consumes attribute to controller classes or action methods that should expect XML in the request body.

    [HttpPost]
    [Consumes("application/xml")]
    public ActionResult<Pet> Create(Pet pet)
    

    詳細については、「XML シリアル化の概要」を参照してください。For more information, see Introducing XML Serialization.

指定された型をモデル バインドから除外するExclude specified types from model binding

モデル バインドおよび検証システムの動作は、ModelMetadata によって駆動されます。The model binding and validation systems' behavior is driven by ModelMetadata. ModelMetadata については、詳細プロバイダーを MvcOptions.ModelMetadataDetailsProviders に追加してカスタマイズできます。You can customize ModelMetadata by adding a details provider to MvcOptions.ModelMetadataDetailsProviders. 組み込みの詳細プロバイダーは、指定された型に対してモデル バインドまたは検証を無効にする場合に使用できます。Built-in details providers are available for disabling model binding or validation for specified types.

指定された型のすべてのモデルに対してモデル バインドを無効にするには、Startup.ConfigureServicesExcludeBindingMetadataProvider を追加します。To disable model binding on all models of a specified type, add an ExcludeBindingMetadataProvider in Startup.ConfigureServices. たとえば、System.Version 型のすべてのモデルに対してモデル バインドを無効にするには、次のようにします。For example, to disable model binding on all models of type System.Version:

services.AddMvc(options =>
{
    options.ValueProviderFactories.Add(new CookieValueProviderFactory());
    options.ModelMetadataDetailsProviders.Add(
        new ExcludeBindingMetadataProvider(typeof(System.Version)));
    options.ModelMetadataDetailsProviders.Add(
        new SuppressChildValidationMetadataProvider(typeof(System.Guid)));
})
.AddXmlSerializerFormatters()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

指定された型のプロパティに対して検証を無効にするには、Startup.ConfigureServicesSuppressChildValidationMetadataProvider を追加します。To disable validation on properties of a specified type, add a SuppressChildValidationMetadataProvider in Startup.ConfigureServices. たとえば、System.Guid 型のプロパティに対して検証を無効にするには、次のようにします。For example, to disable validation on properties of type System.Guid:

services.AddMvc(options =>
{
    options.ValueProviderFactories.Add(new CookieValueProviderFactory());
    options.ModelMetadataDetailsProviders.Add(
        new ExcludeBindingMetadataProvider(typeof(System.Version)));
    options.ModelMetadataDetailsProviders.Add(
        new SuppressChildValidationMetadataProvider(typeof(System.Guid)));
})
.AddXmlSerializerFormatters()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

カスタム モデル バインダーCustom model binders

モデル バインドを拡張するには、カスタム モデル バインダーを記述し、[ModelBinder] 属性を使用してそれを特定のターゲット向けに選択します。You can extend model binding by writing a custom model binder and using the [ModelBinder] attribute to select it for a given target. 詳細については、「custom model binding」 (カスタム モデル バインド) を参照してください。Learn more about custom model binding.

手動によるモデル バインドManual model binding

モデル バインドは、TryUpdateModelAsync メソッドを使用して手動で呼び出すことができます。Model binding can be invoked manually by using the TryUpdateModelAsync method. このメソッドは ControllerBase クラスと PageModel クラスの両方で定義されています。The method is defined on both ControllerBase and PageModel classes. メソッドのオーバーロードにより、使用するプレフィックスと値プロバイダーを指定できます。Method overloads let you specify the prefix and value provider to use. モデル バインドが失敗した場合は、メソッドから false が返されます。The method returns false if model binding fails. 次に例を示します。Here's an example:

if (await TryUpdateModelAsync<InstructorWithCollection>(
    newInstructor,
    "Instructor",
    i => i.FirstMidName, i => i.LastName, i => i.HireDate))
{
    _instructorsInMemoryStore.Add(newInstructor);
    return RedirectToPage("./Index");
}
PopulateAssignedCourseData(newInstructor);
return Page();

[FromServices] 属性[FromServices] attribute

この属性の名前は、データ ソースを指定するモデル バインド属性のパターンに従います。This attribute's name follows the pattern of model binding attributes that specify a data source. ただし、それは、値プロバイダーからのデータ バインドを説明するものではありません。But it's not about binding data from a value provider. 依存関係挿入コンテナーから型のインスタンスが取得されます。It gets an instance of a type from the dependency injection container. その目的は、特定のメソッドが呼び出された場合にのみサービスを必要するときにコンストラクターの挿入の代替手段を提供することにあります。Its purpose is to provide an alternative to constructor injection for when you need a service only if a particular method is called.

その他のリソースAdditional resources