Grazie al model binding di ASP.NET Web Forms, introdotto nella versione 4.5, diventa assolutamente semplice gestire le dipendenze tra i vari oggetti in pagina, o più in generale con il contesto di richiesta, per quanto riguarda il caricamento dei dati.
Immaginiamo, ad esempio di avere una DropDownList che mostra l'elenco di nazioni, e una GridView, all'interno della quale vogliamo mostrare i clienti della nazione selezionata:
<asp:DropDownList runat="server" ID="countriesList" SelectMethod="GetCountries" AutoPostBack="true" AppendDataBoundItems="true"> <asp:ListItem Value="">-- Seleziona --</asp:ListItem> </asp:DropDownList> <asp:GridView runat="server" ID="TheGrid" ItemType="WebApplication9.Customer" SelectMethod="TheGrid_GetData" AutoGenerateColumns="false" AllowPaging="true"> <Columns> ... </Columns> </asp:GridView>
Come possiamo notare, countriesList sfrutta un SelectMethod denominato GetCountries, che restituisce un IQueryable
public IQueryable<string> GetCountries() { return _context.Customers .Select(x => x.Country) .Distinct() .OrderBy(x => x); }
Per quanto riguarda invece il caricamento dei dati della griglia, in questo caso il SelectMethod accetta un parametro country da utilizzare per filtrare la query:
public IQueryable<Customer> TheGrid_GetData ([Control("countriesList")]string country) { return _context.Customers .Where(x => x.Country == country) .OrderBy(x => x.CompanyName); }
Il metodo TheGrid_GetData, dal punto di vista meramente implementativo, è assolutamente banale e non merita particolari commenti. Ciò che è interessante, invece, è il legame del parametro country con l'elemento selezionato di countriesList, grazie all'attributo ControlAttribute.
Esistono diversi parametri di questo tipo, che possiamo sfruttare per controllare i parametri sui metodi di binding e collegarli a query string, session, cookie, ecc. Per esempio, immaginiamo di aver definito una route nell'applicazione per la pagina di dettaglio di un customer:
routes.MapPageRoute("customer-details", "Customers/{id}", "~/Details.aspx");
Nella griglia possiamo inserire un link alla pagina di dettaglio, basato sull'ID del customer corrente, con una semplice template column:
<asp:TemplateField> <ItemTemplate> <asp:HyperLink ID="HyperLink1" runat="server" Text="<%# Item.CompanyName %>" NavigateUrl='<%# GetRouteUrl("customer-details", new { id = Item.CustomerID }) %>' /> </ItemTemplate> </asp:TemplateField>
La pagina Details.aspx contiene una DetailsView per mostrare il dettaglio del customer:
<asp:DetailsView runat="server" ID="CustomerDetails" ItemType="WebApplication9.Customer" SelectMethod="Details_GetItem" />
Anche in questo caso abbiamo sfruttato un SelectMethod, che accetta come parametro un identificativo, che dovrà essere prelevato dai dati di routing. La logica di base non cambia, e l'unica differenza è il differente attributo da utilizzare:
public Customer Details_GetItem([RouteData]string id) { using (var context = new NorthwindEntities()) { return context.Customers.Find(id); } }
Come possiamo notare, insomma, grazie al nuovo model binding introdotto in ASP.NET Web Forms dalla recente release 4.5, possiamo scrivere codice in maniera davvero naturale, e collegarlo facilmente alle diverse dipendenze.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Supportare il sorting di dati tabellari in Blazor con QuickGrid
Evitare il flickering dei componenti nel prerender di Blazor 8
Cambiare la chiave di partizionamento di Azure Cosmos DB
Creare una libreria CSS universale: Immagini
Generare la software bill of material (SBOM) in GitHub
Migrare una service connection a workload identity federation in Azure DevOps
Creare un webhook in Azure DevOps
Utilizzare l'espressione if inline in una pipeline di Azure DevOps
Creare una libreria CSS universale: Clip-path
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Utilizzare il nuovo modello GPT-4o con Azure OpenAI
Utilizzare Container Queries nominali