Associazione di modelli in ASP.NET CoreModel Binding in ASP.NET Core

Questo articolo illustra cos'è l'associazione di modelli, come funziona e come personalizzarne il comportamento.This article explains what model binding is, how it works, and how to customize its behavior.

Visualizzare o scaricare il codice di esempio (procedura per il download).View or download sample code (how to download).

Che cos'è l'associazione di modelliWhat is Model binding

I controller e le pagine Razor operano sui dati provenienti dalle richieste HTTP.Controllers and Razor pages work with data that comes from HTTP requests. Ad esempio, i dati di route possono fornire una chiave del record e i campi modulo inviati possono fornire valori per le proprietà del modello.For example, route data may provide a record key, and posted form fields may provide values for the properties of the model. La scrittura di codice per recuperare tutti i valori e convertirli da stringhe in tipi .NET sarebbe noiosa e soggetta a errori.Writing code to retrieve each of these values and convert them from strings to .NET types would be tedious and error-prone. L'associazione di modelli consente di automatizzare questo processo.Model binding automates this process. Il sistema di associazione di modelli:The model binding system:

  • Recupera i dati da diverse origini, ad esempio i dati di route, i campi modulo e le stringhe di query.Retrieves data from various sources such as route data, form fields, and query strings.
  • Fornisce i dati ai controller e alle pagine Razor in parametri di metodo e proprietà pubbliche.Provides the data to controllers and Razor pages in method parameters and public properties.
  • Converte dati stringa in tipi .NET.Converts string data to .NET types.
  • Aggiorna le proprietà dei tipi complessi.Updates properties of complex types.

EsempioExample

Si supponga di avere il metodo di azione seguente:Suppose you have the following action method:

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

E l'app riceve una richiesta con questo URL:And the app receives a request with this URL:

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

L'associazione di modelli esegue i passaggi seguenti dopo che il sistema di routing seleziona il metodo di azione:Model binding goes through the following steps after the routing system selects the action method:

  • Trova il primo parametro di GetByID, un intero denominato id.Finds the first parameter of GetByID, an integer named id.
  • Esamina le origini disponibili nella richiesta HTTP e trova id = "2" nei dati di route.Looks through the available sources in the HTTP request and finds id = "2" in route data.
  • Converte la stringa "2" nell'intero 2.Converts the string "2" into integer 2.
  • Trova il parametro successivo di GetByID, un valore booleano denominato dogsOnly.Finds the next parameter of GetByID, a boolean named dogsOnly.
  • Esamina le origini e trova "DogsOnly=true" nella stringa di query.Looks through the sources and finds "DogsOnly=true" in the query string. Per la corrispondenza dei nomi non viene applicata la distinzione tra maiuscole e minuscole.Name matching is not case-sensitive.
  • Converte la stringa "true" nel valore booleano true.Converts the string "true" into boolean true.

Il framework chiama quindi il metodo GetById, passando 2 per il parametro id e true per il parametro dogsOnly.The framework then calls the GetById method, passing in 2 for the id parameter, and true for the dogsOnly parameter.

Nell'esempio precedente le destinazioni dell'associazione di modelli sono parametri di metodo che sono tipi semplici.In the preceding example, the model binding targets are method parameters that are simple types. Le destinazioni possono essere anche le proprietà di un tipo complesso.Targets may also be the properties of a complex type. Dopo l'associazione di ogni proprietà, viene eseguita la convalida dei modelli per la proprietà.After each property is successfully bound, model validation occurs for that property. Il record dei dati associati al modello e di eventuali errori di associazione o convalida viene archiviato in ControllerBase.ModelState oppure 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. Per scoprire se questo processo ha esito positivo, l'app controlla il flag ModelState.IsValid.To find out if this process was successful, the app checks the ModelState.IsValid flag.

Server di destinazioneTargets

L'associazione di modelli cerca di trovare i valori per i tipi di destinazioni seguenti:Model binding tries to find values for the following kinds of targets:

  • Parametri del metodo di azione del controller a cui viene indirizzata una richiesta.Parameters of the controller action method that a request is routed to.
  • Parametri del metodo del gestore di Razor Pages a cui viene indirizzata una richiesta.Parameters of the Razor Pages handler method that a request is routed to.
  • Proprietà pubbliche di un controller o una classe PageModel, se specificate dagli attributi.Public properties of a controller or PageModel class, if specified by attributes.

Attributo [BindProperty][BindProperty] attribute

Può essere applicato a una proprietà pubblica di un controller o una classe PageModel per fare in modo che l'associazione di modelli usi tale proprietà come destinazione: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; }

Attributo [BindProperties][BindProperties] attribute

Disponibile in ASP.NET Core 2.1 e versioni successive.Available in ASP.NET Core 2.1 and later. Può essere applicato a un controller o una classe PageModel per indicare all'associazione del modello di usare tutte le proprietà pubbliche della classe come destinazione: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; }

Associazione di modelli per le richieste HTTP GETModel binding for HTTP GET requests

Per impostazione predefinita, le proprietà non vengono associate per le richieste HTTP GET.By default, properties are not bound for HTTP GET requests. In genere, per una richiesta GET è sufficiente un parametro ID record.Typically, all you need for a GET request is a record ID parameter. L'ID record viene usato per cercare l'elemento nel database.The record ID is used to look up the item in the database. Pertanto, non è necessario associare una proprietà che contiene un'istanza del modello.Therefore, there is no need to bind a property that holds an instance of the model. Negli scenari in cui si vogliono associare le proprietà ai dati dalle richieste GET, impostare la proprietà SupportsGet su 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; }

OriginiSources

Per impostazione predefinita, l'associazione di modelli ottiene i dati sotto forma di coppie chiave-valore dalle origini seguenti in una richiesta HTTP:By default, model binding gets data in the form of key-value pairs from the following sources in an HTTP request:

  1. Campi moduloForm fields
  2. Il corpo della richiesta (per i controller con l'attributo [ApiController].)The request body (For controllers that have the [ApiController] attribute.)
  3. Indirizzare i datiRoute data
  4. Parametri della stringa di queryQuery string parameters
  5. File caricatiUploaded files

Per ogni parametro o proprietà di destinazione, le origini vengono analizzate nell'ordine indicato nell'elenco precedente.For each target parameter or property, the sources are scanned in the order indicated in the preceding list. Esistono tuttavia alcune eccezioni:There are a few exceptions:

  • I dati di route e i valori delle stringhe di query vengono usati solo per i tipi semplici.Route data and query string values are used only for simple types.
  • I file caricati vengono associati solo ai tipi di destinazione che implementano IFormFile o IEnumerable<IFormFile>.Uploaded files are bound only to target types that implement IFormFile or IEnumerable<IFormFile>.

Se l'origine predefinita non è corretta, usare uno degli attributi seguenti per specificare l'origine:If the default source is not correct, use one of the following attributes to specify the source:

Questi attributi:These attributes:

  • Vengono aggiunti singolarmente alle proprietà del modello (non alla classe del modello), come nell'esempio seguente: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; }
    
  • Accettano facoltativamente un valore di nome di modello nel costruttore.Optionally accept a model name value in the constructor. Questa opzione è disponibile nel caso in cui il nome della proprietà non corrisponda al valore nella richiesta.This option is provided in case the property name doesn't match the value in the request. Il valore nella richiesta, ad esempio, potrebbe essere un'intestazione con un segno meno nel nome, come nell'esempio seguente: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)
    

Attributo [FromBody][FromBody] attribute

Applicare l'attributo [FromBody] a un parametro per popolarne le proprietà dal corpo di una richiesta HTTP.Apply the [FromBody] attribute to a parameter to populate its properties from the body of an HTTP request. Il runtime di ASP.NET Core delega la responsabilità della lettura del corpo a un formattatore di input.The ASP.NET Core runtime delegates the responsibility of reading the body to an input formatter. I formattatori di input sono descritti più avanti in questo articolo.Input formatters are explained later in this article.

Quando [FromBody] viene applicato a un parametro di tipo complesso, tutti gli attributi di origine di associazione applicati alle relative proprietà vengono ignorati.When [FromBody] is applied to a complex type parameter, any binding source attributes applied to its properties are ignored. Ad esempio, il Create azione seguente specifica che il relativo parametro pet viene popolato dal corpo:For example, the following Create action specifies that its pet parameter is populated from the body:

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

La classe Pet specifica che la relativa proprietà Breed viene popolata da un parametro della stringa di query: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; }
}

Nell'esempio precedente:In the preceding example:

  • L'attributo [FromQuery] viene ignorato.The [FromQuery] attribute is ignored.
  • La proprietà Breed non viene popolata da un parametro della stringa di query.The Breed property is not populated from a query string parameter.

I formattatori di input leggono solo il corpo e non comprendono gli attributi di origine del binding.Input formatters read only the body and don't understand binding source attributes. Se nel corpo viene trovato un valore appropriato, tale valore viene usato per popolare la proprietà Breed.If a suitable value is found in the body, that value is used to populate the Breed property.

Non applicare [FromBody] a più di un parametro per ogni metodo di azione.Don't apply [FromBody] to more than one parameter per action method. Quando il flusso di richieste viene letto da un formattatore di input, non è più disponibile per la lettura per l'associazione di altri parametri [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.

Origini aggiuntiveAdditional sources

I dati di origine vengono forniti al sistema di associazione di modelli dai provider di valori.Source data is provided to the model binding system by value providers. È possibile scrivere e registrare i provider di valori personalizzati che recuperano i dati per l'associazione di modelli da altre origini.You can write and register custom value providers that get data for model binding from other sources. Ad esempio, potrebbe essere necessario recuperare dati dai cookie o dallo stato della sessione.For example, you might want data from cookies or session state. Per ottenere dati da una nuova origine:To get data from a new source:

  • Creare una classe che implementi IValueProvider.Create a class that implements IValueProvider.
  • Creare una classe che implementi IValueProviderFactory.Create a class that implements IValueProviderFactory.
  • Registrare la classe factory in Startup.ConfigureServices.Register the factory class in Startup.ConfigureServices.

L'app di esempio include un esempio di provider di valori e factory che ottiene i valori dai cookie.The sample app includes a value provider and factory example that gets values from cookies. Ecco il codice di registrazione in 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();

Il codice illustrato posiziona il provider di valori personalizzati dopo tutti i provider di valori predefiniti.The code shown puts the custom value provider after all the built-in value providers. Per renderlo il primo nell'elenco, chiamare Insert(0, new CookieValueProviderFactory()) invece di Add.To make it the first in the list, call Insert(0, new CookieValueProviderFactory()) instead of Add.

Nessuna origine per una proprietà del modelloNo source for a model property

Per impostazione predefinita, non viene creato un errore di stato del modello se non viene trovato alcun valore per una proprietà del modello.By default, a model state error isn't created if no value is found for a model property. La proprietà viene impostata su Null o su un valore predefinito:The property is set to null or a default value:

  • I tipi semplici nullable vengono impostati su null.Nullable simple types are set to null.
  • I tipi valore non nullable vengono impostati su default(T).Non-nullable value types are set to default(T). Ad esempio, un parametro int id viene impostato su 0.For example, a parameter int id is set to 0.
  • Per i tipi complessi, l'associazione di modelli crea un'istanza usando il costruttore predefinito, senza impostare proprietà.For complex Types, model binding creates an instance by using the default constructor, without setting properties.
  • Le matrici vengono impostate su Array.Empty<T>(), ad eccezione delle matrici byte[] che vengono impostate su null.Arrays are set to Array.Empty<T>(), except that byte[] arrays are set to null.

Se lo stato del modello deve essere invalidato quando non viene trovato alcun elemento nei campi del modulo per una proprietà del modello, usare l'attributo [BindRequired] .If model state should be invalidated when nothing is found in form fields for a model property, use the [BindRequired] attribute.

Si noti che questo comportamento [BindRequired] si applica all'associazione di modelli dai dati di moduli inviati e non ai dati JSON o XML nel corpo di una richiesta.Note that this [BindRequired] behavior applies to model binding from posted form data, not to JSON or XML data in a request body. I dati del corpo della richiesta vengono gestiti dai formattatori di input.Request body data is handled by input formatters.

Errori di conversione dei tipiType conversion errors

Se viene trovata un'origine ma non può essere convertita nel tipo di destinazione, lo stato del modello viene contrassegnato come non valido.If a source is found but can't be converted into the target type, model state is flagged as invalid. Il parametro o la proprietà di destinazione viene impostato su Null o su un valore predefinito, come indicato nella sezione precedente.The target parameter or property is set to null or a default value, as noted in the previous section.

In un controller API con l'attributo [ApiController], uno stato del modello non valido genera una risposta HTTP 400 automatica.In an API controller that has the [ApiController] attribute, invalid model state results in an automatic HTTP 400 response.

In una pagina Razor visualizzare di nuovo la pagina con un messaggio di errore: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");
}

La convalida sul lato client consente di rilevare la maggior parte dei dati non validi che, in caso contrario, verrebbero inviati a un modulo di Razor Pages.Client-side validation catches most bad data that would otherwise be submitted to a Razor Pages form. Questa convalida rende difficile attivare il codice sopra evidenziato.This validation makes it hard to trigger the preceding highlighted code. L'app di esempio include un pulsante Submit with Invalid Date (Invia con data non valida) che inserisce dati non validi nel campo Hire Date (Data assunzione) e invia il modulo.The sample app includes a Submit with Invalid Date button that puts bad data in the Hire Date field and submits the form. Questo pulsante illustra il funzionamento del codice per visualizzare di nuovo la pagina quando si verificano errori di conversione dei dati.This button shows how the code for redisplaying the page works when data conversion errors occur.

Quando la pagina viene nuovamente visualizzata dal codice precedente, l'input non valido non viene visualizzato nel campo modulo.When the page is redisplayed by the preceding code, the invalid input is not shown in the form field. Questo avviene perché la proprietà del modello è stata impostata su Null o su un valore predefinito.This is because the model property has been set to null or a default value. L'input non valido viene visualizzato in un messaggio di errore.The invalid input does appear in an error message. Ma se si vogliono visualizzare di nuovo i dati non validi nel campo modulo, è consigliabile impostare la proprietà del modello come stringa ed eseguire manualmente la conversione dei dati.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.

La stessa strategia è consigliata se si vuole evitare che gli errori di conversione del tipo causino errori di stato del modello.The same strategy is recommended if you don't want type conversion errors to result in model state errors. In tal caso, impostare la proprietà del modello come stringa.In that case, make the model property a string.

Tipi sempliciSimple types

I tipi semplici in cui lo strumento di associazione di modelli può convertire le stringhe di origine includono i seguenti:The simple types that the model binder can convert source strings into include the following:

Tipi complessiComplex types

Un tipo pubblico deve avere un costruttore predefinito pubblico e proprietà scrivibili pubbliche da associare.A complex type must have a public default constructor and public writable properties to bind. Quando si verifica l'associazione di modelli, vengono create istanze della classe usando il costruttore predefinito pubblico.When model binding occurs, the class is instantiated using the public default constructor.

Per ogni proprietà del tipo complesso, l'associazione di modelli cerca il modello di nome prefisso.nome_proprietà nelle origini.For each property of the complex type, model binding looks through the sources for the name pattern prefix.property_name. Se non viene trovato, cerca semplicemente nome_proprietà senza il prefisso.If nothing is found, it looks for just property_name without the prefix.

Per l'associazione a un parametro, il prefisso è il nome del parametro.For binding to a parameter, the prefix is the parameter name. Per l'associazione a una proprietà pubblica PageModel, il prefisso è il nome della proprietà pubblica.For binding to a PageModel public property, the prefix is the public property name. Alcuni attributi hanno una proprietà Prefix che consente di eseguire l'override dell'utilizzo predefinito del nome di un parametro o una proprietà.Some attributes have a Prefix property that lets you override the default usage of parameter or property name.

Ad esempio, si supponga che il tipo complesso sia la classe Instructor seguente: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; }
}

Prefisso = nome del parametroPrefix = parameter name

Se il modello da associare è un parametro denominato instructorToUpdate:If the model to be bound is a parameter named instructorToUpdate:

public IActionResult OnPost(int? id, Instructor instructorToUpdate)

L'associazione di modelli cerca prima di tutto la chiave instructorToUpdate.ID nelle origini.Model binding starts by looking through the sources for the key instructorToUpdate.ID. Se non viene trovata, cerca ID senza prefisso.If that isn't found, it looks for ID without a prefix.

Prefisso = nome della proprietàPrefix = property name

Se il modello da associare è una proprietà denominata Instructor del controller o della classe PageModel:If the model to be bound is a property named Instructor of the controller or PageModel class:

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

L'associazione di modelli cerca prima di tutto la chiave Instructor.ID nelle origini.Model binding starts by looking through the sources for the key Instructor.ID. Se non viene trovata, cerca ID senza prefisso.If that isn't found, it looks for ID without a prefix.

Prefisso personalizzatoCustom prefix

Se il modello da associare è un parametro denominato instructorToUpdate e un attributo Bind specifica Instructor come prefisso: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)

L'associazione di modelli cerca prima di tutto la chiave Instructor.ID nelle origini.Model binding starts by looking through the sources for the key Instructor.ID. Se non viene trovata, cerca ID senza prefisso.If that isn't found, it looks for ID without a prefix.

Attributi per le destinazioni di tipo complessoAttributes for complex type targets

Sono disponibili vari attributi predefiniti per controllare l'associazione di modelli di tipi complessi:Several built-in attributes are available for controlling model binding of complex types:

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

Nota

Questi attributi influiscono sul modello di associazione quando i dati di modulo inviati sono l'origine dei valori.These attributes affect model binding when posted form data is the source of values. Non influiscono sui formattatori di input, che elaborano corpi di richieste JSON e XML inviati.They do not affect input formatters, which process posted JSON and XML request bodies. I formattatori di input sono descritti più avanti in questo articolo.Input formatters are explained later in this article.

Vedere anche la discussione relativa all'attributo [Required] in Convalida del modello.See also the discussion of the [Required] attribute in Model validation.

Attributo [BindRequired][BindRequired] attribute

Può essere applicato solo alle proprietà del modello e non ai parametri di metodo.Can only be applied to model properties, not to method parameters. Con questo attributo l'associazione di modelli aggiunge un errore di stato del modello se non è possibile eseguire l'associazione per una proprietà del modello.Causes model binding to add a model state error if binding cannot occur for a model's property. Ad esempio: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; }

Attributo [BindNever][BindNever] attribute

Può essere applicato solo alle proprietà del modello e non ai parametri di metodo.Can only be applied to model properties, not to method parameters. Impedisce all'associazione di modelli di impostare una proprietà del modello.Prevents model binding from setting a model's property. Ad esempio:Here's an example:

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

Attributo [Bind][Bind] attribute

Può essere applicato a una classe o a un parametro di metodo.Can be applied to a class or a method parameter. Specifica quali proprietà di un modello devono essere incluse nell'associazione di modelli.Specifies which properties of a model should be included in model binding.

Nell'esempio seguente vengono associate solo le proprietà specificate del modello Instructor quando viene chiamato qualsiasi gestore o metodo di azione: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

Nell'esempio seguente vengono associate solo le proprietà specificate del modello Instructor quando viene chiamato il metodo OnPost: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)

L'attributo [Bind] può essere usato per evitare l'overposting negli scenari di creazione.The [Bind] attribute can be used to protect against overposting in create scenarios. Non funziona bene negli scenari di modifica perché le proprietà escluse vengono impostate su Null o su un valore predefinito anziché rimanere inalterate.It doesn't work well in edit scenarios because excluded properties are set to null or a default value instead of being left unchanged. Per difendersi dall'overposting, sono consigliati i modelli di visualizzazione anziché l'attributo [Bind].For defense against overposting, view models are recommended rather than the [Bind] attribute. Per altre informazioni, vedere Nota sulla sicurezza relativa all'overposting.For more information, see Security note about overposting.

RaccolteCollections

Per le destinazioni che sono raccolte di tipi semplici, l'associazione di modelli cerca le corrispondenze per nome_parametro oppure nome_proprietà.For targets that are collections of simple types, model binding looks for matches to parameter_name or property_name. Se non viene trovata alcuna corrispondenza, viene cercato uno dei formati supportati senza il prefisso.If no match is found, it looks for one of the supported formats without the prefix. Ad esempio:For example:

  • Si supponga che il parametro da associare sia una matrice denominata selectedCourses:Suppose the parameter to be bound is an array named selectedCourses:

    public IActionResult OnPost(int? id, int[] selectedCourses)
    
  • I dati di modulo o di stringhe di query possono essere in uno dei formati seguenti: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
    
  • Il formato seguente è supportato solo nei dati di modulo:The following format is supported only in form data:

    selectedCourses[]=1050&selectedCourses[]=2000
    
  • Per tutti i formati di esempio precedenti, l'associazione di modelli passa una matrice di due elementi al parametro 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

    Per i formati di dati che usano numeri con indice (... [0]... [1]...) è necessario assicurarsi che la numerazione sia progressiva a partire da zero.Data formats that use subscript numbers (... [0] ... [1] ...) must ensure that they are numbered sequentially starting at zero. Se sono presenti eventuali interruzioni nella numerazione con indice, tutti gli elementi dopo l'interruzione vengono ignorati.If there are any gaps in subscript numbering, all items after the gap are ignored. Ad esempio, se gli indici sono 0 e 2 anziché 0 e 1, il secondo elemento viene ignorato.For example, if the subscripts are 0 and 2 instead of 0 and 1, the second item is ignored.

DizionariDictionaries

Per le destinazioni Dictionary, l'associazione di modelli cerca le corrispondenze per nome_parametro oppure nome_proprietà.For Dictionary targets, model binding looks for matches to parameter_name or property_name. Se non viene trovata alcuna corrispondenza, viene cercato uno dei formati supportati senza il prefisso.If no match is found, it looks for one of the supported formats without the prefix. Ad esempio:For example:

  • Si supponga che il parametro di destinazione sia un elemento Dictionary<int, string> denominato selectedCourses:Suppose the target parameter is a Dictionary<int, string> named selectedCourses:

    public IActionResult OnPost(int? id, Dictionary<int, string> selectedCourses)
    
  • I dati di modulo o di stringhe di query inviati possono essere simili a uno degli esempi seguenti: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
    
  • Per tutti i formati di esempio precedenti, l'associazione di modelli passa un dizionario di due elementi al parametro 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"

Comportamento di globalizzazione dell'associazione di modelli dati della route e stringhe di queryGlobalization behavior of model binding route data and query strings

Il provider del valore della route ASP.NET Core e il provider del valore della stringa di query:The ASP.NET Core route value provider and query string value provider:

  • Considera i valori come impostazioni cultura invarianti.Treat values as invariant culture.
  • Si prevede che gli URL siano impostazioni cultura invarianti.Expect that URLs are culture-invariant.

Al contrario, i valori provenienti dai dati del form subiscono una conversione con distinzione delle impostazioni cultura.In contrast, values coming from form data undergo a culture-sensitive conversion. Questa operazione è progettata in modo che gli URL siano condivisibili tra le impostazioni locali.This is by design so that URLs are shareable across locales.

Per rendere il provider del valore di route ASP.NET Core e il provider di valori della stringa di query sottoposti a una conversione dipendente dalle impostazioni cultura: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;
    }
}

Tipi di dati specialiSpecial data types

Esistono alcuni tipi di dati speciali che l'associazione di modelli può gestire.There are some special data types that model binding can handle.

IFormFile e IFormFileCollectionIFormFile and IFormFileCollection

Un file caricato incluso nella richiesta HTTP.An uploaded file included in the HTTP request. È anche supportato IEnumerable<IFormFile> per più file.Also supported is IEnumerable<IFormFile> for multiple files.

CancellationTokenCancellationToken

usato per annullare l'attività nei controller asincroni.Used to cancel activity in asynchronous controllers.

FormCollectionFormCollection

Usato per recuperare tutti i valori dai dati di modulo inviati.Used to retrieve all the values from posted form data.

Formattatori di inputInput formatters

I dati nel corpo della richiesta possono essere in formato JSON, XML o in altri formati.Data in the request body can be in JSON, XML, or some other format. Per analizzare questi dati, l'associazione di modelli usa un formattatore di input configurato in modo da gestire un particolare tipo di contenuto.To parse this data, model binding uses an input formatter that is configured to handle a particular content type. Per impostazione predefinita, ASP.NET Core include i formattatori di input basati su JSON per la gestione dei dati JSON.By default, ASP.NET Core includes JSON based input formatters for handling JSON data. È possibile aggiungere altri formattatori per altri tipi di contenuto.You can add other formatters for other content types.

ASP.NET Core consente di selezionare i formattatori di input in base all'attributo Consumes.ASP.NET Core selects input formatters based on the Consumes attribute. Se non è presente alcun attributo, viene usata l'intestazione Content-Type.If no attribute is present, it uses the Content-Type header.

Per usare i formattatori di input XML predefiniti:To use the built-in XML input formatters:

  • Installare il pacchetto NuGet Microsoft.AspNetCore.Mvc.Formatters.Xml.Install the Microsoft.AspNetCore.Mvc.Formatters.Xml NuGet package.

  • In Startup.ConfigureServices chiamare AddXmlSerializerFormatters o 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();
    
  • Applicare l'attributo Consumes alle classi controller o ai metodi di azione che devono aspettarsi XML nel corpo della richiesta.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)
    

    Per altre informazioni, vedere Introduzione alla serializzazione XML.For more information, see Introducing XML Serialization.

Personalizzare l'associazione di modelli con formattatori di inputCustomize model binding with input formatters

Un formattatore di input assume la piena responsabilità per la lettura dei dati dal corpo della richiesta.An input formatter takes full responsibility for reading data from the request body. Per personalizzare questo processo, configurare le API usate dal formattatore di input.To customize this process, configure the APIs used by the input formatter. In questa sezione viene descritto come personalizzare il formattatore di input basato su System.Text.Jsonper comprendere un tipo personalizzato denominato ObjectId.This section describes how to customize the System.Text.Json-based input formatter to understand a custom type named ObjectId.

Si consideri il modello seguente, che contiene una proprietà ObjectId personalizzata denominata Id:Consider the following model, which contains a custom ObjectId property named Id:

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

Per personalizzare il processo di associazione del modello quando si usa System.Text.Json, creare una classe derivata da 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);
    }
}

Per usare un convertitore personalizzato, applicare l'attributo JsonConverterAttribute al tipo.To use a custom converter, apply the JsonConverterAttribute attribute to the type. Nell'esempio seguente il tipo di ObjectId viene configurato con ObjectIdConverter come convertitore personalizzato: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; }
}

Per ulteriori informazioni, vedere come scrivere convertitori personalizzati.For more information, see How to write custom converters.

Escludere i tipi specificati dall'associazione di modelliExclude specified types from model binding

Il comportamento dell'associazione di modelli e del sistema di convalida è determinato da ModelMetadata.The model binding and validation systems' behavior is driven by ModelMetadata. È possibile personalizzare ModelMetadata mediante l'aggiunta di un provider di dettagli a MvcOptions.ModelMetadataDetailsProviders.You can customize ModelMetadata by adding a details provider to MvcOptions.ModelMetadataDetailsProviders. Sono disponibili provider di dettagli predefiniti per la disabilitazione dell'associazione di modelli o la convalida per i tipi specificati.Built-in details providers are available for disabling model binding or validation for specified types.

Per disabilitare l'associazione di modelli per tutti i modelli di un tipo specificato, aggiungere un ExcludeBindingMetadataProvider in Startup.ConfigureServices.To disable model binding on all models of a specified type, add an ExcludeBindingMetadataProvider in Startup.ConfigureServices. Ad esempio, per disabilitare l'associazione di modelli per tutti i modelli di tipo 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();

Per disabilitare la convalida per le proprietà di un tipo specificato, aggiungere un SuppressChildValidationMetadataProvider in Startup.ConfigureServices.To disable validation on properties of a specified type, add a SuppressChildValidationMetadataProvider in Startup.ConfigureServices. Ad esempio, per disabilitare la convalida per le proprietà di tipo 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();

Strumenti di associazione di modelli personalizzatiCustom model binders

È possibile estendere l'associazione di modelli scrivendo uno strumento di associazione di modelli personalizzato e usando l'attributo [ModelBinder] per selezionarlo per una determinata destinazione.You can extend model binding by writing a custom model binder and using the [ModelBinder] attribute to select it for a given target. Altre informazioni sull'associazione di modelli personalizzata.Learn more about custom model binding.

Associazione di modelli manualeManual model binding

L'associazione di modelli può essere richiamata manualmente usando il metodo TryUpdateModelAsync.Model binding can be invoked manually by using the TryUpdateModelAsync method. Il metodo è definito in entrambe le classi ControllerBase e PageModel.The method is defined on both ControllerBase and PageModel classes. Gli overload del metodo consentono di specificare il prefisso e il provider di valori da usare.Method overloads let you specify the prefix and value provider to use. Il metodo restituisce false se l'associazione di modelli non riesce.The method returns false if model binding fails. Ad esempio: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 usa i provider di valori per ottenere i dati dal corpo del form, dalla stringa di query e dai dati della route.TryUpdateModelAsync uses value providers to get data from the form body, query string, and route data. TryUpdateModelAsync è in genere:TryUpdateModelAsync is typically:

  • Usato con le app Razor Pages e MVC usando i controller e le visualizzazioni per impedire l'overposting.Used with Razor Pages and MVC apps using controllers and views to prevent over-posting.
  • Non utilizzato con un'API Web, a meno che non venga utilizzato da dati del modulo, stringhe di query e dati di route.Not used with a web API unless consumed from form data, query strings, and route data. Gli endpoint dell'API Web che utilizzano JSON utilizzano formattatori di input per deserializzare il corpo della richiesta in un oggetto.Web API endpoints that consume JSON use Input formatters to deserialize the request body into an object.

Per ulteriori informazioni, vedere TryUpdateModelAsync.For more information, see TryUpdateModelAsync.

Attributo [FromServices][FromServices] attribute

Il nome di questo attributo segue il modello degli attributi di associazione di modelli che specificano un'origine dati.This attribute's name follows the pattern of model binding attributes that specify a data source. Non si tratta però dell'associazione di dati da un provider di valori.But it's not about binding data from a value provider. Ottiene un'istanza di un tipo dal contenitore di inserimento delle dipendenze.It gets an instance of a type from the dependency injection container. Lo scopo è fornire un'alternativa all'inserimento del costruttore per quando è necessario un servizio solo se viene chiamato un metodo specifico.Its purpose is to provide an alternative to constructor injection for when you need a service only if a particular method is called.

Risorse aggiuntiveAdditional resources

Questo articolo illustra cos'è l'associazione di modelli, come funziona e come personalizzarne il comportamento.This article explains what model binding is, how it works, and how to customize its behavior.

Visualizzare o scaricare il codice di esempio (procedura per il download).View or download sample code (how to download).

Che cos'è l'associazione di modelliWhat is Model binding

I controller e le pagine Razor operano sui dati provenienti dalle richieste HTTP.Controllers and Razor pages work with data that comes from HTTP requests. Ad esempio, i dati di route possono fornire una chiave del record e i campi modulo inviati possono fornire valori per le proprietà del modello.For example, route data may provide a record key, and posted form fields may provide values for the properties of the model. La scrittura di codice per recuperare tutti i valori e convertirli da stringhe in tipi .NET sarebbe noiosa e soggetta a errori.Writing code to retrieve each of these values and convert them from strings to .NET types would be tedious and error-prone. L'associazione di modelli consente di automatizzare questo processo.Model binding automates this process. Il sistema di associazione di modelli:The model binding system:

  • Recupera i dati da diverse origini, ad esempio i dati di route, i campi modulo e le stringhe di query.Retrieves data from various sources such as route data, form fields, and query strings.
  • Fornisce i dati ai controller e alle pagine Razor in parametri di metodo e proprietà pubbliche.Provides the data to controllers and Razor pages in method parameters and public properties.
  • Converte dati stringa in tipi .NET.Converts string data to .NET types.
  • Aggiorna le proprietà dei tipi complessi.Updates properties of complex types.

EsempioExample

Si supponga di avere il metodo di azione seguente:Suppose you have the following action method:

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

E l'app riceve una richiesta con questo URL:And the app receives a request with this URL:

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

L'associazione di modelli esegue i passaggi seguenti dopo che il sistema di routing seleziona il metodo di azione:Model binding goes through the following steps after the routing system selects the action method:

  • Trova il primo parametro di GetByID, un intero denominato id.Finds the first parameter of GetByID, an integer named id.
  • Esamina le origini disponibili nella richiesta HTTP e trova id = "2" nei dati di route.Looks through the available sources in the HTTP request and finds id = "2" in route data.
  • Converte la stringa "2" nell'intero 2.Converts the string "2" into integer 2.
  • Trova il parametro successivo di GetByID, un valore booleano denominato dogsOnly.Finds the next parameter of GetByID, a boolean named dogsOnly.
  • Esamina le origini e trova "DogsOnly=true" nella stringa di query.Looks through the sources and finds "DogsOnly=true" in the query string. Per la corrispondenza dei nomi non viene applicata la distinzione tra maiuscole e minuscole.Name matching is not case-sensitive.
  • Converte la stringa "true" nel valore booleano true.Converts the string "true" into boolean true.

Il framework chiama quindi il metodo GetById, passando 2 per il parametro id e true per il parametro dogsOnly.The framework then calls the GetById method, passing in 2 for the id parameter, and true for the dogsOnly parameter.

Nell'esempio precedente le destinazioni dell'associazione di modelli sono parametri di metodo che sono tipi semplici.In the preceding example, the model binding targets are method parameters that are simple types. Le destinazioni possono essere anche le proprietà di un tipo complesso.Targets may also be the properties of a complex type. Dopo l'associazione di ogni proprietà, viene eseguita la convalida dei modelli per la proprietà.After each property is successfully bound, model validation occurs for that property. Il record dei dati associati al modello e di eventuali errori di associazione o convalida viene archiviato in ControllerBase.ModelState oppure 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. Per scoprire se questo processo ha esito positivo, l'app controlla il flag ModelState.IsValid.To find out if this process was successful, the app checks the ModelState.IsValid flag.

Server di destinazioneTargets

L'associazione di modelli cerca di trovare i valori per i tipi di destinazioni seguenti:Model binding tries to find values for the following kinds of targets:

  • Parametri del metodo di azione del controller a cui viene indirizzata una richiesta.Parameters of the controller action method that a request is routed to.
  • Parametri del metodo del gestore di Razor Pages a cui viene indirizzata una richiesta.Parameters of the Razor Pages handler method that a request is routed to.
  • Proprietà pubbliche di un controller o una classe PageModel, se specificate dagli attributi.Public properties of a controller or PageModel class, if specified by attributes.

Attributo [BindProperty][BindProperty] attribute

Può essere applicato a una proprietà pubblica di un controller o una classe PageModel per fare in modo che l'associazione di modelli usi tale proprietà come destinazione: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; }

Attributo [BindProperties][BindProperties] attribute

Disponibile in ASP.NET Core 2.1 e versioni successive.Available in ASP.NET Core 2.1 and later. Può essere applicato a un controller o una classe PageModel per indicare all'associazione del modello di usare tutte le proprietà pubbliche della classe come destinazione: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; }

Associazione di modelli per le richieste HTTP GETModel binding for HTTP GET requests

Per impostazione predefinita, le proprietà non vengono associate per le richieste HTTP GET.By default, properties are not bound for HTTP GET requests. In genere, per una richiesta GET è sufficiente un parametro ID record.Typically, all you need for a GET request is a record ID parameter. L'ID record viene usato per cercare l'elemento nel database.The record ID is used to look up the item in the database. Pertanto, non è necessario associare una proprietà che contiene un'istanza del modello.Therefore, there is no need to bind a property that holds an instance of the model. Negli scenari in cui si vogliono associare le proprietà ai dati dalle richieste GET, impostare la proprietà SupportsGet su 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; }

OriginiSources

Per impostazione predefinita, l'associazione di modelli ottiene i dati sotto forma di coppie chiave-valore dalle origini seguenti in una richiesta HTTP:By default, model binding gets data in the form of key-value pairs from the following sources in an HTTP request:

  1. Campi moduloForm fields
  2. Il corpo della richiesta (per i controller con l'attributo [ApiController].)The request body (For controllers that have the [ApiController] attribute.)
  3. Indirizzare i datiRoute data
  4. Parametri della stringa di queryQuery string parameters
  5. File caricatiUploaded files

Per ogni parametro o proprietà di destinazione, le origini vengono analizzate nell'ordine indicato nell'elenco precedente.For each target parameter or property, the sources are scanned in the order indicated in the preceding list. Esistono tuttavia alcune eccezioni:There are a few exceptions:

  • I dati di route e i valori delle stringhe di query vengono usati solo per i tipi semplici.Route data and query string values are used only for simple types.
  • I file caricati vengono associati solo ai tipi di destinazione che implementano IFormFile o IEnumerable<IFormFile>.Uploaded files are bound only to target types that implement IFormFile or IEnumerable<IFormFile>.

Se l'origine predefinita non è corretta, usare uno degli attributi seguenti per specificare l'origine:If the default source is not correct, use one of the following attributes to specify the source:

Questi attributi:These attributes:

  • Vengono aggiunti singolarmente alle proprietà del modello (non alla classe del modello), come nell'esempio seguente: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; }
    
  • Accettano facoltativamente un valore di nome di modello nel costruttore.Optionally accept a model name value in the constructor. Questa opzione è disponibile nel caso in cui il nome della proprietà non corrisponda al valore nella richiesta.This option is provided in case the property name doesn't match the value in the request. Il valore nella richiesta, ad esempio, potrebbe essere un'intestazione con un segno meno nel nome, come nell'esempio seguente: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)
    

Attributo [FromBody][FromBody] attribute

Applicare l'attributo [FromBody] a un parametro per popolarne le proprietà dal corpo di una richiesta HTTP.Apply the [FromBody] attribute to a parameter to populate its properties from the body of an HTTP request. Il runtime di ASP.NET Core delega la responsabilità della lettura del corpo a un formattatore di input.The ASP.NET Core runtime delegates the responsibility of reading the body to an input formatter. I formattatori di input sono descritti più avanti in questo articolo.Input formatters are explained later in this article.

Quando [FromBody] viene applicato a un parametro di tipo complesso, tutti gli attributi di origine di associazione applicati alle relative proprietà vengono ignorati.When [FromBody] is applied to a complex type parameter, any binding source attributes applied to its properties are ignored. Ad esempio, il Create azione seguente specifica che il relativo parametro pet viene popolato dal corpo:For example, the following Create action specifies that its pet parameter is populated from the body:

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

La classe Pet specifica che la relativa proprietà Breed viene popolata da un parametro della stringa di query: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; }
}

Nell'esempio precedente:In the preceding example:

  • L'attributo [FromQuery] viene ignorato.The [FromQuery] attribute is ignored.
  • La proprietà Breed non viene popolata da un parametro della stringa di query.The Breed property is not populated from a query string parameter.

I formattatori di input leggono solo il corpo e non comprendono gli attributi di origine del binding.Input formatters read only the body and don't understand binding source attributes. Se nel corpo viene trovato un valore appropriato, tale valore viene usato per popolare la proprietà Breed.If a suitable value is found in the body, that value is used to populate the Breed property.

Non applicare [FromBody] a più di un parametro per ogni metodo di azione.Don't apply [FromBody] to more than one parameter per action method. Quando il flusso di richieste viene letto da un formattatore di input, non è più disponibile per la lettura per l'associazione di altri parametri [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.

Origini aggiuntiveAdditional sources

I dati di origine vengono forniti al sistema di associazione di modelli dai provider di valori.Source data is provided to the model binding system by value providers. È possibile scrivere e registrare i provider di valori personalizzati che recuperano i dati per l'associazione di modelli da altre origini.You can write and register custom value providers that get data for model binding from other sources. Ad esempio, potrebbe essere necessario recuperare dati dai cookie o dallo stato della sessione.For example, you might want data from cookies or session state. Per ottenere dati da una nuova origine:To get data from a new source:

  • Creare una classe che implementi IValueProvider.Create a class that implements IValueProvider.
  • Creare una classe che implementi IValueProviderFactory.Create a class that implements IValueProviderFactory.
  • Registrare la classe factory in Startup.ConfigureServices.Register the factory class in Startup.ConfigureServices.

L'app di esempio include un esempio di provider di valori e factory che ottiene i valori dai cookie.The sample app includes a value provider and factory example that gets values from cookies. Ecco il codice di registrazione in 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);

Il codice illustrato posiziona il provider di valori personalizzati dopo tutti i provider di valori predefiniti.The code shown puts the custom value provider after all the built-in value providers. Per renderlo il primo nell'elenco, chiamare Insert(0, new CookieValueProviderFactory()) invece di Add.To make it the first in the list, call Insert(0, new CookieValueProviderFactory()) instead of Add.

Nessuna origine per una proprietà del modelloNo source for a model property

Per impostazione predefinita, non viene creato un errore di stato del modello se non viene trovato alcun valore per una proprietà del modello.By default, a model state error isn't created if no value is found for a model property. La proprietà viene impostata su Null o su un valore predefinito:The property is set to null or a default value:

  • I tipi semplici nullable vengono impostati su null.Nullable simple types are set to null.
  • I tipi valore non nullable vengono impostati su default(T).Non-nullable value types are set to default(T). Ad esempio, un parametro int id viene impostato su 0.For example, a parameter int id is set to 0.
  • Per i tipi complessi, l'associazione di modelli crea un'istanza usando il costruttore predefinito, senza impostare proprietà.For complex Types, model binding creates an instance by using the default constructor, without setting properties.
  • Le matrici vengono impostate su Array.Empty<T>(), ad eccezione delle matrici byte[] che vengono impostate su null.Arrays are set to Array.Empty<T>(), except that byte[] arrays are set to null.

Se lo stato del modello deve essere invalidato quando non viene trovato alcun elemento nei campi del modulo per una proprietà del modello, usare l'attributo [BindRequired] .If model state should be invalidated when nothing is found in form fields for a model property, use the [BindRequired] attribute.

Si noti che questo comportamento [BindRequired] si applica all'associazione di modelli dai dati di moduli inviati e non ai dati JSON o XML nel corpo di una richiesta.Note that this [BindRequired] behavior applies to model binding from posted form data, not to JSON or XML data in a request body. I dati del corpo della richiesta vengono gestiti dai formattatori di input.Request body data is handled by input formatters.

Errori di conversione dei tipiType conversion errors

Se viene trovata un'origine ma non può essere convertita nel tipo di destinazione, lo stato del modello viene contrassegnato come non valido.If a source is found but can't be converted into the target type, model state is flagged as invalid. Il parametro o la proprietà di destinazione viene impostato su Null o su un valore predefinito, come indicato nella sezione precedente.The target parameter or property is set to null or a default value, as noted in the previous section.

In un controller API con l'attributo [ApiController], uno stato del modello non valido genera una risposta HTTP 400 automatica.In an API controller that has the [ApiController] attribute, invalid model state results in an automatic HTTP 400 response.

In una pagina Razor visualizzare di nuovo la pagina con un messaggio di errore: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");
}

La convalida sul lato client consente di rilevare la maggior parte dei dati non validi che, in caso contrario, verrebbero inviati a un modulo di Razor Pages.Client-side validation catches most bad data that would otherwise be submitted to a Razor Pages form. Questa convalida rende difficile attivare il codice sopra evidenziato.This validation makes it hard to trigger the preceding highlighted code. L'app di esempio include un pulsante Submit with Invalid Date (Invia con data non valida) che inserisce dati non validi nel campo Hire Date (Data assunzione) e invia il modulo.The sample app includes a Submit with Invalid Date button that puts bad data in the Hire Date field and submits the form. Questo pulsante illustra il funzionamento del codice per visualizzare di nuovo la pagina quando si verificano errori di conversione dei dati.This button shows how the code for redisplaying the page works when data conversion errors occur.

Quando la pagina viene nuovamente visualizzata dal codice precedente, l'input non valido non viene visualizzato nel campo modulo.When the page is redisplayed by the preceding code, the invalid input is not shown in the form field. Questo avviene perché la proprietà del modello è stata impostata su Null o su un valore predefinito.This is because the model property has been set to null or a default value. L'input non valido viene visualizzato in un messaggio di errore.The invalid input does appear in an error message. Ma se si vogliono visualizzare di nuovo i dati non validi nel campo modulo, è consigliabile impostare la proprietà del modello come stringa ed eseguire manualmente la conversione dei dati.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.

La stessa strategia è consigliata se si vuole evitare che gli errori di conversione del tipo causino errori di stato del modello.The same strategy is recommended if you don't want type conversion errors to result in model state errors. In tal caso, impostare la proprietà del modello come stringa.In that case, make the model property a string.

Tipi sempliciSimple types

I tipi semplici in cui lo strumento di associazione di modelli può convertire le stringhe di origine includono i seguenti:The simple types that the model binder can convert source strings into include the following:

Tipi complessiComplex types

Un tipo pubblico deve avere un costruttore predefinito pubblico e proprietà scrivibili pubbliche da associare.A complex type must have a public default constructor and public writable properties to bind. Quando si verifica l'associazione di modelli, vengono create istanze della classe usando il costruttore predefinito pubblico.When model binding occurs, the class is instantiated using the public default constructor.

Per ogni proprietà del tipo complesso, l'associazione di modelli cerca il modello di nome prefisso.nome_proprietà nelle origini.For each property of the complex type, model binding looks through the sources for the name pattern prefix.property_name. Se non viene trovato, cerca semplicemente nome_proprietà senza il prefisso.If nothing is found, it looks for just property_name without the prefix.

Per l'associazione a un parametro, il prefisso è il nome del parametro.For binding to a parameter, the prefix is the parameter name. Per l'associazione a una proprietà pubblica PageModel, il prefisso è il nome della proprietà pubblica.For binding to a PageModel public property, the prefix is the public property name. Alcuni attributi hanno una proprietà Prefix che consente di eseguire l'override dell'utilizzo predefinito del nome di un parametro o una proprietà.Some attributes have a Prefix property that lets you override the default usage of parameter or property name.

Ad esempio, si supponga che il tipo complesso sia la classe Instructor seguente: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; }
}

Prefisso = nome del parametroPrefix = parameter name

Se il modello da associare è un parametro denominato instructorToUpdate:If the model to be bound is a parameter named instructorToUpdate:

public IActionResult OnPost(int? id, Instructor instructorToUpdate)

L'associazione di modelli cerca prima di tutto la chiave instructorToUpdate.ID nelle origini.Model binding starts by looking through the sources for the key instructorToUpdate.ID. Se non viene trovata, cerca ID senza prefisso.If that isn't found, it looks for ID without a prefix.

Prefisso = nome della proprietàPrefix = property name

Se il modello da associare è una proprietà denominata Instructor del controller o della classe PageModel:If the model to be bound is a property named Instructor of the controller or PageModel class:

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

L'associazione di modelli cerca prima di tutto la chiave Instructor.ID nelle origini.Model binding starts by looking through the sources for the key Instructor.ID. Se non viene trovata, cerca ID senza prefisso.If that isn't found, it looks for ID without a prefix.

Prefisso personalizzatoCustom prefix

Se il modello da associare è un parametro denominato instructorToUpdate e un attributo Bind specifica Instructor come prefisso: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)

L'associazione di modelli cerca prima di tutto la chiave Instructor.ID nelle origini.Model binding starts by looking through the sources for the key Instructor.ID. Se non viene trovata, cerca ID senza prefisso.If that isn't found, it looks for ID without a prefix.

Attributi per le destinazioni di tipo complessoAttributes for complex type targets

Sono disponibili vari attributi predefiniti per controllare l'associazione di modelli di tipi complessi:Several built-in attributes are available for controlling model binding of complex types:

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

Nota

Questi attributi influiscono sul modello di associazione quando i dati di modulo inviati sono l'origine dei valori.These attributes affect model binding when posted form data is the source of values. Non influiscono sui formattatori di input, che elaborano corpi di richieste JSON e XML inviati.They do not affect input formatters, which process posted JSON and XML request bodies. I formattatori di input sono descritti più avanti in questo articolo.Input formatters are explained later in this article.

Vedere anche la discussione relativa all'attributo [Required] in Convalida del modello.See also the discussion of the [Required] attribute in Model validation.

Attributo [BindRequired][BindRequired] attribute

Può essere applicato solo alle proprietà del modello e non ai parametri di metodo.Can only be applied to model properties, not to method parameters. Con questo attributo l'associazione di modelli aggiunge un errore di stato del modello se non è possibile eseguire l'associazione per una proprietà del modello.Causes model binding to add a model state error if binding cannot occur for a model's property. Ad esempio: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; }

Attributo [BindNever][BindNever] attribute

Può essere applicato solo alle proprietà del modello e non ai parametri di metodo.Can only be applied to model properties, not to method parameters. Impedisce all'associazione di modelli di impostare una proprietà del modello.Prevents model binding from setting a model's property. Ad esempio:Here's an example:

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

Attributo [Bind][Bind] attribute

Può essere applicato a una classe o a un parametro di metodo.Can be applied to a class or a method parameter. Specifica quali proprietà di un modello devono essere incluse nell'associazione di modelli.Specifies which properties of a model should be included in model binding.

Nell'esempio seguente vengono associate solo le proprietà specificate del modello Instructor quando viene chiamato qualsiasi gestore o metodo di azione: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

Nell'esempio seguente vengono associate solo le proprietà specificate del modello Instructor quando viene chiamato il metodo OnPost: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)

L'attributo [Bind] può essere usato per evitare l'overposting negli scenari di creazione.The [Bind] attribute can be used to protect against overposting in create scenarios. Non funziona bene negli scenari di modifica perché le proprietà escluse vengono impostate su Null o su un valore predefinito anziché rimanere inalterate.It doesn't work well in edit scenarios because excluded properties are set to null or a default value instead of being left unchanged. Per difendersi dall'overposting, sono consigliati i modelli di visualizzazione anziché l'attributo [Bind].For defense against overposting, view models are recommended rather than the [Bind] attribute. Per altre informazioni, vedere Nota sulla sicurezza relativa all'overposting.For more information, see Security note about overposting.

RaccolteCollections

Per le destinazioni che sono raccolte di tipi semplici, l'associazione di modelli cerca le corrispondenze per nome_parametro oppure nome_proprietà.For targets that are collections of simple types, model binding looks for matches to parameter_name or property_name. Se non viene trovata alcuna corrispondenza, viene cercato uno dei formati supportati senza il prefisso.If no match is found, it looks for one of the supported formats without the prefix. Ad esempio:For example:

  • Si supponga che il parametro da associare sia una matrice denominata selectedCourses:Suppose the parameter to be bound is an array named selectedCourses:

    public IActionResult OnPost(int? id, int[] selectedCourses)
    
  • I dati di modulo o di stringhe di query possono essere in uno dei formati seguenti: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
    
  • Il formato seguente è supportato solo nei dati di modulo:The following format is supported only in form data:

    selectedCourses[]=1050&selectedCourses[]=2000
    
  • Per tutti i formati di esempio precedenti, l'associazione di modelli passa una matrice di due elementi al parametro 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

    Per i formati di dati che usano numeri con indice (... [0]... [1]...) è necessario assicurarsi che la numerazione sia progressiva a partire da zero.Data formats that use subscript numbers (... [0] ... [1] ...) must ensure that they are numbered sequentially starting at zero. Se sono presenti eventuali interruzioni nella numerazione con indice, tutti gli elementi dopo l'interruzione vengono ignorati.If there are any gaps in subscript numbering, all items after the gap are ignored. Ad esempio, se gli indici sono 0 e 2 anziché 0 e 1, il secondo elemento viene ignorato.For example, if the subscripts are 0 and 2 instead of 0 and 1, the second item is ignored.

DizionariDictionaries

Per le destinazioni Dictionary, l'associazione di modelli cerca le corrispondenze per nome_parametro oppure nome_proprietà.For Dictionary targets, model binding looks for matches to parameter_name or property_name. Se non viene trovata alcuna corrispondenza, viene cercato uno dei formati supportati senza il prefisso.If no match is found, it looks for one of the supported formats without the prefix. Ad esempio:For example:

  • Si supponga che il parametro di destinazione sia un elemento Dictionary<int, string> denominato selectedCourses:Suppose the target parameter is a Dictionary<int, string> named selectedCourses:

    public IActionResult OnPost(int? id, Dictionary<int, string> selectedCourses)
    
  • I dati di modulo o di stringhe di query inviati possono essere simili a uno degli esempi seguenti: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
    
  • Per tutti i formati di esempio precedenti, l'associazione di modelli passa un dizionario di due elementi al parametro 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"

Comportamento di globalizzazione dell'associazione di modelli dati della route e stringhe di queryGlobalization behavior of model binding route data and query strings

Il provider del valore della route ASP.NET Core e il provider del valore della stringa di query:The ASP.NET Core route value provider and query string value provider:

  • Considera i valori come impostazioni cultura invarianti.Treat values as invariant culture.
  • Si prevede che gli URL siano impostazioni cultura invarianti.Expect that URLs are culture-invariant.

Al contrario, i valori provenienti dai dati del form subiscono una conversione con distinzione delle impostazioni cultura.In contrast, values coming from form data undergo a culture-sensitive conversion. Questa operazione è progettata in modo che gli URL siano condivisibili tra le impostazioni locali.This is by design so that URLs are shareable across locales.

Per rendere il provider del valore di route ASP.NET Core e il provider di valori della stringa di query sottoposti a una conversione dipendente dalle impostazioni cultura: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;
    }
}

Tipi di dati specialiSpecial data types

Esistono alcuni tipi di dati speciali che l'associazione di modelli può gestire.There are some special data types that model binding can handle.

IFormFile e IFormFileCollectionIFormFile and IFormFileCollection

Un file caricato incluso nella richiesta HTTP.An uploaded file included in the HTTP request. È anche supportato IEnumerable<IFormFile> per più file.Also supported is IEnumerable<IFormFile> for multiple files.

CancellationTokenCancellationToken

usato per annullare l'attività nei controller asincroni.Used to cancel activity in asynchronous controllers.

FormCollectionFormCollection

Usato per recuperare tutti i valori dai dati di modulo inviati.Used to retrieve all the values from posted form data.

Formattatori di inputInput formatters

I dati nel corpo della richiesta possono essere in formato JSON, XML o in altri formati.Data in the request body can be in JSON, XML, or some other format. Per analizzare questi dati, l'associazione di modelli usa un formattatore di input configurato in modo da gestire un particolare tipo di contenuto.To parse this data, model binding uses an input formatter that is configured to handle a particular content type. Per impostazione predefinita, ASP.NET Core include i formattatori di input basati su JSON per la gestione dei dati JSON.By default, ASP.NET Core includes JSON based input formatters for handling JSON data. È possibile aggiungere altri formattatori per altri tipi di contenuto.You can add other formatters for other content types.

ASP.NET Core consente di selezionare i formattatori di input in base all'attributo Consumes.ASP.NET Core selects input formatters based on the Consumes attribute. Se non è presente alcun attributo, viene usata l'intestazione Content-Type.If no attribute is present, it uses the Content-Type header.

Per usare i formattatori di input XML predefiniti:To use the built-in XML input formatters:

  • Installare il pacchetto NuGet Microsoft.AspNetCore.Mvc.Formatters.Xml.Install the Microsoft.AspNetCore.Mvc.Formatters.Xml NuGet package.

  • In Startup.ConfigureServices chiamare AddXmlSerializerFormatters o 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);
    
  • Applicare l'attributo Consumes alle classi controller o ai metodi di azione che devono aspettarsi XML nel corpo della richiesta.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)
    

    Per altre informazioni, vedere Introduzione alla serializzazione XML.For more information, see Introducing XML Serialization.

Escludere i tipi specificati dall'associazione di modelliExclude specified types from model binding

Il comportamento dell'associazione di modelli e del sistema di convalida è determinato da ModelMetadata.The model binding and validation systems' behavior is driven by ModelMetadata. È possibile personalizzare ModelMetadata mediante l'aggiunta di un provider di dettagli a MvcOptions.ModelMetadataDetailsProviders.You can customize ModelMetadata by adding a details provider to MvcOptions.ModelMetadataDetailsProviders. Sono disponibili provider di dettagli predefiniti per la disabilitazione dell'associazione di modelli o la convalida per i tipi specificati.Built-in details providers are available for disabling model binding or validation for specified types.

Per disabilitare l'associazione di modelli per tutti i modelli di un tipo specificato, aggiungere un ExcludeBindingMetadataProvider in Startup.ConfigureServices.To disable model binding on all models of a specified type, add an ExcludeBindingMetadataProvider in Startup.ConfigureServices. Ad esempio, per disabilitare l'associazione di modelli per tutti i modelli di tipo 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);

Per disabilitare la convalida per le proprietà di un tipo specificato, aggiungere un SuppressChildValidationMetadataProvider in Startup.ConfigureServices.To disable validation on properties of a specified type, add a SuppressChildValidationMetadataProvider in Startup.ConfigureServices. Ad esempio, per disabilitare la convalida per le proprietà di tipo 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);

Strumenti di associazione di modelli personalizzatiCustom model binders

È possibile estendere l'associazione di modelli scrivendo uno strumento di associazione di modelli personalizzato e usando l'attributo [ModelBinder] per selezionarlo per una determinata destinazione.You can extend model binding by writing a custom model binder and using the [ModelBinder] attribute to select it for a given target. Altre informazioni sull'associazione di modelli personalizzata.Learn more about custom model binding.

Associazione di modelli manualeManual model binding

L'associazione di modelli può essere richiamata manualmente usando il metodo TryUpdateModelAsync.Model binding can be invoked manually by using the TryUpdateModelAsync method. Il metodo è definito in entrambe le classi ControllerBase e PageModel.The method is defined on both ControllerBase and PageModel classes. Gli overload del metodo consentono di specificare il prefisso e il provider di valori da usare.Method overloads let you specify the prefix and value provider to use. Il metodo restituisce false se l'associazione di modelli non riesce.The method returns false if model binding fails. Ad esempio: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();

Attributo [FromServices][FromServices] attribute

Il nome di questo attributo segue il modello degli attributi di associazione di modelli che specificano un'origine dati.This attribute's name follows the pattern of model binding attributes that specify a data source. Non si tratta però dell'associazione di dati da un provider di valori.But it's not about binding data from a value provider. Ottiene un'istanza di un tipo dal contenitore di inserimento delle dipendenze.It gets an instance of a type from the dependency injection container. Lo scopo è fornire un'alternativa all'inserimento del costruttore per quando è necessario un servizio solo se viene chiamato un metodo specifico.Its purpose is to provide an alternative to constructor injection for when you need a service only if a particular method is called.

Risorse aggiuntiveAdditional resources