Sfruttare le dipendenze con il model binding di ASP.NET Web Forms

di Marco De Sanctis, in ASP.NET 4.5,

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 grazie all'implementazione seguente:

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi