Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Le novità  di Visual Studio 11 (parte quarta)

Link copiato negli appunti

Visual Studio 11 (vNext), la prossima versione del noto ambiente di sviluppo Microsoft, porterà  con se numerose novità  che con questa serie di post stiamo cercando di affrontare per non trovarci impreparati quando Visual Studio 11 sarà  rilasciato ufficialmente. Sempre in tema di Data Binding, dopo aver parlato del nuovo paradigma denominato Model Binding ed aver visto un piccolo esempio di come sia diventato davvero semplice mettere in binding un controllo server con i nostri metodi di accesso ai dati, vedremo ora come sarà  altrettanto semplice impostare dei filtri sui dati da visualizzare.

Nel post precedente abbiamo visto l'esempio di una GridView di prodotti:

<asp:GridView ID="gvProducts" runat="server" ModelType="MyApp.Product"
    SelectMethod="GetProducts" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="ID" HeaderText="ID" />
        <asp:BoundField DataField="Name" HeaderText="Nome" />
        <asp:BoundField DataField="Description" HeaderText="Descrizione" />
        <asp:TemplateField HeaderText="Venduti">
            <ItemTemplate><%# Item.Orders.Count %></ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

Che popolavamo con un semplice metodo di recupero dati:

public IQueryable<Product> GetProducts() {
    var dbECommerce = new dbECommerce();
    return dbECommerce.Products.Include(o => o.Orders);
}

Se oltre a cià ora volessimo anche fare in modo che l'utente possa filtrare i dati sulla base di un certo parametro (oltre che visualizzare tutti i prodotti) possiamo sfruttare i nuovi Value Providers, ovvero una modalità  per recuperare valori da posti differenti (querystring, controlli, ecc). Ipotizziamo allora di voler filtrare i prodotti per nome prendendo il nome per cui filtrare dalla querystring:

public IQueryable<Product> GetProducts([QueryString]string name)
{
    IQueryable<Product> query = dbECommerce.Products;
    if (!String.IsNullOrWhiteSpace(name))
    {
        query = query.Where(p => p.Name.Contains(name));
    }
    return query;
}

Notiamo l'attributo [QueryString] prima del tipo del parametro name. Questo attributo informa il Model Binding del fatto che il valore del parametro name dovrà  essere recuperato, se esistente, dall'omonimo parametro eventualmente presente nella querystring. Sarà  il sistema ad occuparsi di tutto ed eventualmente di recuperare il parametro dalla querystring, verificare che sia diverso da null e nel caso effettuarne il cast. Tutto automaticamente!
Se poi volessimo dare un nome diverso al parametro in querystring, sarà  sufficiente specificare il nome tra parentesi:

public IQueryable<Product> GetProducts([QueryString("n")]string name)

Ovvio, anche prima era possibile fare la stessa cosa ma certamente non con questa semplicità .

Andando avanti, ipotizziamo ora di voler filtrare i prodotti non più per nome ma per categoria e di aver predisposto allo scopo una DropDownList con l'elenco delle categorie. Anche in questo caso, tutto molto semplice:

public IQueryable<Product> GetProducts([Control] int? category)
{
       IQueryable<Product> query = dbECommerce.Products;
       if (category.HasValue)
       {
          query = query.Where(p => p.IDCategory == category);
       }
       return query;
}

Anche in questo caso abbiamo utilizzato un attributo ma questa volta l'attributo è [Control] il quale informa il Model Binding di recuperare il valore dell'attributo category da un controllo presente nella pagina avente il medesimo nome (il controllo cioè dovrà  avere ID="category").

Questo è sufficiente per filtrare i prodotti sulla base della categoria selezionata nella DropDownList. Come vediamo il parametro è di tipo int nullable in quanto se nella DropDownList non viene effettuata alcuna selezione, verranno presi tutti i prodotti, mentre se viene selezionata una particolare categoria non solo di questa ne verrà  preso l'ID ma l'ID sarà  anche convertito in int per essere passato come filtro all'istruzione Where.

Ti consigliamo anche