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
Rendere i propri workflow e le GitHub Action utilizzate più sicure
Recuperare l'ultima versione di una release di GitHub
Utilizzare un numero per gestire la concorrenza ottimistica con SQL Server ed Entity Framework
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
Filtrare i dati di una QuickGrid in Blazor con una drop down list
Escludere alcuni file da GitHub Secret Scanning
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
Supportare lo HierarchyID di Sql Server in Entity Framework 8
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Recuperare App Service cancellati su Azure
Conoscere il rendering Server o WebAssembly a runtime in Blazor
Configurare il nome della run di un workflow di GitHub in base al contesto di esecuzione