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
Usare i servizi di Azure OpenAI e ChatGPT in ASP.NET Core con Semantic Kernel
Limitare le richieste lato server con l'interactive routing di Blazor 8
Utilizzare la versione generica di EntityTypeConfiguration in Entity Framework Core
Popolare una classe a partire dal testo, con Semantic Kernel e ASP.NET Core Web API
Ordine e importanza per @layer in CSS
Eseguire un metodo asincrono dopo il set di una proprietà in Blazor 8
Utilizzare QuickGrid di Blazor con Entity Framework
Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
Utilizzare i primary constructor in C#
Utilizzare gRPC su App Service di Azure
Rinnovare il token di una GitHub App durante l'esecuzione di un workflow
Modificare i metadati nell'head dell'HTML di una Blazor Web App