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

di , 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

Sfruttare le dipendenze con il model binding di ASP.NET Web Forms (#1117) 1010 2
| Condividi su: Twitter, Facebook, LinkedIn, Google+

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