Quando gestiamo l'input dell'utente in ASP.NET MVC, spesso ci limitiamo a realizzare una action, invocata in POST, che accetta come parametro un oggetto del model:
[HttpPost] public ActionResult SaveInvoice(Invoice invoice) { // codice qui ... }
Il runtime, e in particolar modo di un oggetto chiamato ModelBinder, ha poi il compito di trasformare il contenuto della request HTTP in una istanza dell'oggetto Invoice. Nell specifico, il DefaultModelBinder di ASP.NET MVC è in grado quantomeno di popolare tutte le proprietà di tipi "nativi", vale a dire stringhe, interi, date, ecc. L'unico requisito è che, per ognuna di esse, abbiamo costruito l'editor in maniera corretta, ad esempio sfruttando l'helper EditorFor:
@Model Invoice @* ... codice e markup html ... *@ Numero fattura: @Html.EditorFor(m => m.Number) Data fattura: @Html.EditorFor(m => m.Date)
Alle volte, però, capita di dover gestire delle collection di dati, ad esempio perchè vogliamo realizzare una griglia editabile tramite cui modificare i dettagli di una fattura. Questo caso è perfettamente supportato dal DefaultModelBinder di ASP.NET MVC, a patto di generare l'editor in questo modo:
<table> @for (int i = 0; i < Model.Details; i++) { <tr> <td>@Html.EditorFor(m => m.Details<i>.Product)</td> <td>@Html.EditorFor(m => m.Details<i>.Quantity)</td> <td>@Html.EditorFor(m => m.Details<i>.Price)</td> </td> } </table>
Il parametro di EditorFor è, come sempre, una lambda expression che accetta in input il Model e restituisce l'elemento da editare. Nel nostro caso, il model è ancora una volta l'intero oggetto Invoice, e ciò che facciamo è semplicemente quello di accedere all'elemento i-esimo della collection di dettagli per restituirne la proprietà desiderata. L'unico vincolo, affinché tutto funzioni, è quello di esplicitare l'indice dell'elemento nella lambda expression ed è questo il motivo per il quale abbiamo utilizzato l'istruzione for, invece di foreach, per ciclare la collection dei dettagli fattura.
Seguendo questa semplice regola, il DefaultModelBinder sarà in grado di ricostruire anche la collection dei dettagli e di inviare alla nostra Action, un oggetto Invoice completo dei dettagli inseriti dall'utente.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Migliorare l'organizzazione delle risorse con Azure Policy
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Esporre i propri servizi applicativi con Semantic Kernel e ASP.NET Web API
Gestire liste di tipi semplici con Entity Framework Core
Filtering sulle colonne in una QuickGrid di Blazor
Generare la software bill of material (SBOM) in GitHub
C# 12: Cosa c'è di nuovo e interessante
Utilizzare QuickGrid di Blazor con Entity Framework
Eseguire query manipolando le liste contenute in un oggetto mappato verso una colonna JSON
Utilizzare la versione generica di EntityTypeConfiguration in Entity Framework Core
Utilizzare il trigger SQL con le Azure Function
Filtrare i dati di una QuickGrid in Blazor con una drop down list
I più letti di oggi
- Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
- Eseguire script pre e post esecuzione di un workflow di GitHub
- Creare una libreria CSS universale: Cards
- Migliorare l'organizzazione delle risorse con Azure Policy