Condividi tramite


Il presente articolo è stato tradotto automaticamente.

Concetti sui dati

Paging lato server con Entity Framework e ASP.NET MVC 3

Julie Lerman

Scaricare il codice di esempio

image: Julie LermanNel mio Coordinate di febbraio colonna, ho illustrato il jQuery DataTables plug-in e la possibilità di gestire senza difficoltà enormi quantità di dati sul lato client. Questa procedura funziona bene con le applicazioni Web in cui si desidera suddividere e ripartire grandi quantità di dati. Questo mese, mi concentrerò sull'utilizzo di query che restituiscono i payload più piccoli per attivare un diverso tipo di interazione con i dati. Questo è particolarmente importante quando si fermerà applicazioni per dispositivi mobili.

Analizzerò le funzionalità introdotte in ASP.NET MVC 3 e viene illustrato come utilizzare queste unite al paging sul lato server efficace contro l'Entity Framework. Esistono due problemi grazie a questa attività. Il primo è quello di fornire una query di Entity Framework con i parametri corretti di paging. Il secondo è per simulare una funzionalità di paging del lato client per fornire indizi visivi per indicare la presenza di ulteriori dati da recuperare, nonché i collegamenti per attivare il recupero.

ASP.NET MVC 3 ha una grande quantità di nuove funzionalità, ad esempio il nuovo lametta visualizzare motore, i miglioramenti di convalida e molto più funzioni JavaScript. Occupa la pagina di avvio per MVC ASP.NET/MVC, dove è possibile scaricare ASP.NET MVC 3 e collegamenti al post di blog e i video di formazione che consentono di acquisire dimestichezza. Una delle nuove funzionalità da utilizzare è la ViewBag. Se si è utilizzato ASP.NET MVC in precedenza, ViewBag è una versione avanzata della classe ViewData e consente di utilizzare le proprietà create dinamicamente.

Un altro elemento nuovo che ASP.NET MVC 3 offre per la tabella è la System.Web.Helpers.WebGrid specializzati. Anche se una delle funzionalità della griglia di paging si utilizzerà la nuova griglia ma non il paging in questo esempio, poiché tale spostamento sul lato client, in altre parole, le pagine mediante una serie di dati forniti a esso, simile a DataTables plug-in. Verrà utilizzato invece di paging sul lato server.

Per questa piccola applicazione, è necessario per lavorare con un Entity Data Model. Si utilizzi uno creato dal database di esempio Microsoft AdventureWorksLT, ma è necessario solo il cliente e SalesOrderHeaders introdotte nel modello. Ho spostata il cliente rowguid, la proprietà PasswordHash e PasswordSalt in un'entità separata, in modo che non è necessario preoccuparsi di loro durante la modifica. Diverso da questa modifica di piccole dimensioni, non ho modificato il modello predefinito.

Ho creato un progetto utilizzando l'impostazione predefinita ASP.NET MVC 3 modello di progetto. Questo vengono precompilate da un numero di controller e visualizzazioni e dirò predefinito HomeController presentano i clienti.

Si utilizzerà una semplice classe DataAccess per fornire l'interazione con il modello di contesto e, successivamente, il database. In questa classe, il metodo GetPagedCustomers consente di paging del lato server. Se l'obiettivo di ASP.NET MVC applicazione è stata per consentire all'utente di interagire con tutti i clienti, che verrebbe numerosi clienti restituiti in una singola query e gestite nel browser. Invece, è lasciata all'10 righe presenti applicazione alla volta e il GetPagedCustomers fornirà tale filtro. Alla fine devo prima di eseguire la query ha il seguente aspetto:

contesto.Customers.WHERE(c =>c.SalesOrderHeaders.Any()).Skip(Skip).Take(Take).ToList ()

La visualizzazione saprà quale pagina richiesta e fornirle al controller. Il controller sarà responsabile di conoscere il numero di righe per fornire per ogni pagina. Il controller consente di calcolare il valore di "Ignora" utilizzando il numero di pagina e il numero di righe per pagina. Quando il controller chiama il metodo GetPagedCustomers, passerà il valore calcolato skip, nonché il numero di righe per pagina, ovvero il valore di "Prendere". Pertanto, se siamo nella pagina quattro e dieci righe per pagina di presentazione, skip saranno 40 e take sarà 10.

La query di paging viene prima creato un filtro che richiede solo i clienti che dispongono degli eventuali ordini di vendita. Quindi, utilizzando LINQ Skip e Take metodi, i dati risultanti è un sottoinsieme di tali clienti. Nel database viene eseguita la query completa, incluso il paging. Il database restituisce solo il numero di righe specificato dal metodo Take.

La query è costituita da alcune parti per abilitare alcuni trucchi che aggiungerò la strada verso il basso. Di seguito è un passaggio primo il metodo GetPagedCustomers che verrà chiamato dal HomeController:

Elenco statico pubblico <Customer>GetPagedCustomers (Ignora int, int take) {utilizzando (contesto var = AdventureWorksLTEntities()) nuovo {var query = context.Customers.include("SalesOrderHeaders").WHERE(c =>c.SalesOrderHeaders.Any()).OrderBy(c =>c.CompanyName + c.LastName + c.FirstName);

        Restituisce la query.Skip(Skip).Take(Take).ToList ();} }

Il controller Index, metodo che chiama questo metodo determina il numero di righe da restituire utilizzando una variabile chiamerò pageSize, che diventa il valore di Take. L'indice metodo occorrerà specificare dove iniziare basato su un numero di pagina che verrà passato come parametro, come illustrato di seguito:

ActionResult Index(int? pubblica
pagina) {const pageSize int = 10;var (customers=DataAccess.GetPagedCustomers) ((pagina??
0) * pageSize, pageSize);restituire View(customers);}

Si ottiene una buona parte del modo in cui. Il paging del lato server è completamente. Con un WebGrid nel codice di visualizzazione dell'indice, è possibile visualizzare i clienti restituiti dal metodo GetPagedCustomers. Nel codice, è necessario dichiarare e creare un'istanza della griglia, il passaggio nel modello, che rappresenta l'elenco <Customer>che è stato fornito quando il controller di creazione della visualizzazione. Quindi, utilizzando il metodo GetHtml di WebGrid, è possibile formattare la griglia, che specifica le colonne da visualizzare. Verrà mostrato solo tre delle proprietà del cliente: NomeSocietà, FirstName e LastName. Sarete felici di trovare supporto IntelliSense completo mentre si digita questo codice, se si utilizzano la sintassi associata con visualizzazioni ASPX o con la nuova sintassi di motore di visualizzazione MVC 3 lametta (come nell'esempio riportato di seguito). Nella prima colonna, verranno forniti un ActionLink modificare in modo che l'utente può modificare uno qualsiasi dei clienti che vengono visualizzati:

@ {var griglia = nuovo WebGrid(Model);} < div id = "customergrid" >@ griglia.GetHtml (colonne: griglia.Colonne (griglia.Colonna (formato: (item) = >ActionLink ("Modifica", "Modifica", new {customerId = articolo.CustomerID})), griglia.Colonna ("companyname", "Società"), griglia.Colonna ("firstname", "Nome"), griglia.Colonna ("Cognome", "Cognome"))) </div>

Il risultato viene illustrato nella Figura 1.

image: Providing Edit ActionLinks in the WebGrid

Figura 1 fornendo ActionLinks di modifica nel WebGrid

Fin qui, tutto bene. Ma ciò non fornisce un modo per l'utente passare a un'altra pagina di dati. Esistono diversi modi per ottenere questo risultato. È un modo per specificare il numero di pagina nell'URI, ad esempio, http://adventureworksmvc.com/Page/3. Sicuramente non si desidera chiedere agli utenti finali per effettuare questa operazione. Un meccanismo più facilmente individuabile consiste nel disporre di controlli di spostamento, ad esempio i collegamenti dei numeri pagina "1 2 3 4 5 …" o i collegamenti che indicano avanti e indietro, ad esempio, "<>".

L'ostacolo corrente ad attivare i collegamenti di spostamento è che la pagina di visualizzazione di indice non è a conoscenza che non vi siano più clienti da acquisire. SA solo che il panorama dei clienti è il 10 viene visualizzata. Aggiunta di una logica aggiuntiva per il livello di accesso ai dati e passando verso il basso la visualizzazione del controller, è possibile risolvere il problema. Iniziamo con la logica di accesso ai dati.

Per sapere se vi sono altri record oltre il set corrente di clienti, è necessario disporre di un conteggio di tutti i possibili clienti che la query restituisce senza paginazione in gruppi di 10. Si tratta in cui costituiscono la query di GetPagedCustomers estinto. Notare che la prima query vengono restituite in _customerQuery, una variabile dichiarata a livello di classe, come illustrato di seguito:

_customerQuery = context.Customers.WHERE(c =>c.SalesOrderHeaders.Any());

È possibile aggiungere il metodo di conteggio alla fine della query per ottenere il conteggio di tutti i clienti che soddisfano la query prima dell'applicazione di paging. Il metodo di conteggio impone una query relativamente semplice da eseguire immediatamente. Di seguito è riportata la query eseguita in SQL Server da cui la risposta restituisce un valore:

SELECT [GroupBy1].[A1] COME [C1] FROM (Seleziona COUNT(1) AS [A1] da [SalesLT]. [Cliente] come [Extent1] in cui EXISTS (SELECT 1 come [C1] da [SalesLT]. [SalesOrderHeader] come [Extent2] dove [Extent1].[IDCliente] = [Extent2].[IDCliente]) ), [GroupBy1]

Una volta ottenuto il conteggio, è possibile determinare se la pagina corrente dei clienti è la prima pagina, l'ultima pagina o un elemento nel mezzo. Quindi è possibile utilizzare tale logica per stabilire i collegamenti da visualizzare. Ad esempio, se si è di là della prima pagina dei clienti, è logico per visualizzare un collegamento per accedere alle pagine precedenti dei dati dei clienti con un collegamento alla pagina precedente, ad esempio, "<<."

È possibile calcolare i valori per rappresentare questa logica della classe di accesso ai dati e quindi esporlo in una classe wrapper con i clienti. Ecco la nuova classe che si possono utilizzare:

public class PagedList <T>{public bool HasNext {get;set;} public bool HasPrevious {get;set;} Pubblica elenco <T>Entità {get;set;} }

Metodo GetPagedCustomers restituirà una classe PagedList anziché un elenco. Figura 2 illustra la nuova versione di GetPagedCustomers.

Figura 2 la nuova versione di GetPagedCustomers

public static PagedList <Customer>GetPagedCustomers (Ignora int, int take) {utilizzando (contesto var = AdventureWorksLTEntities()) nuovo {var query = context.Customers.include("SalesOrderHeaders").WHERE(c =>c.SalesOrderHeaders.Any()).OrderBy(c =>c.CompanyName + c.LastName + c.FirstName);

        var customerCount = query.Count;

        i clienti di var = query.Skip(Skip).Take(Take).ToList ();
      
        restituire PagedList nuova <Customer>{Le entità = clienti, HasNext = (skip + 10 <customerCount), HasPrevious = (Ignora >0) };} }

Con le nuove variabili popolate, passiamo a come il metodo di indice nel HomeController può li spingono torna alla visualizzazione. Ecco dove è possibile utilizzare il nuovo ViewBag. I risultati della query i clienti viene ancora restituita in una visualizzazione, ma è inoltre possibile trasmettere i valori per verificare come apparirà il markup per i collegamenti precedenti e successivo nel ViewBag. Saranno disponibili per la visualizzazione in fase di esecuzione:

ActionResult Index(int? pubblica
pagina) {const pageSize int = 10;var (customers=DataAccess.GetPagedCustomers) ((pagina??
0) * pageSize, pageSize);ViewBag.HasPrevious = DataAccess.HasPreviousCustomers;ViewBag.HasMore = DataAccess.HasMoreCustomers;ViewBag.CurrentPage = (pagina??
0);restituire View(customers);}

È importante comprendere che il ViewBag è dinamico, non fortemente tipizzati. ViewBag non esiste realmente HasPrevious e HasMore. Appena apportate loro durante la digitazione del codice. In modo da non essere provvisti di IntelliSense non suggerita questo all'utente. È possibile creare qualsiasi proprietà dinamiche che si desidera.

Se si sta utilizzando il dizionario di ViewPage.ViewData e sono curiosi come questo comportamento è diverso, ViewBag è è il processo stesso. Ma oltre a rendere il codice dall'aspetto più accattivante un po', le proprietà vengono digitate. Ad esempio, HasNext è un {bool} dinamico e CurrentPage è un dinamico {int}. Non sarà necessario eseguire il cast di valori durante il recupero in un secondo momento.

Nel codice, si verifica ancora l'elenco dei clienti nella variabile di modello, ma non vi è disponibile anche una variabile ViewBag. Si è proprio durante la digitazione nella finestra delle proprietà dinamiche nel codice. Una descrizione comandi viene ricordato che le proprietà sono dinamiche, come illustrato nella nella figura 3.

image: ViewBag Properties Aren’t Available Through IntelliSense Because They’re Dynamic

Figura 3 ViewBag proprietà non sono disponibili tramite IntelliSense perché sono dinamici

Ecco il codice che utilizza le variabili ViewBag per determinare se visualizzare i collegamenti di spostamento o meno:

@ {Se (ViewBag.HasPrevious) {@ Html.ActionLink("<<", "Index", new {page = (ViewBag.CurrentPage-1)})}}

@ {Se (ViewBag.HasMore) {@ Html.ActionLink(">>", "Index", new {page = (ViewBag.CurrentPage + 1)})}}

Questa logica è una versione di codice utilizzato nell'esercitazione di applicazione di NerdDinner, è possibile trovare nel nerddinnerbook.S3.amazonaws.com/intro.htm.

A questo punto durante l'esecuzione dell'applicazione, ho la possibilità di passare da una pagina di clienti a quella successiva.

Se si utilizza la prima pagina, si dispone di un collegamento per passare alla pagina successiva, ma non per passare alla pagina precedente, poiché non vi è Nessuna (vedere nella figura 4).

image: The First Page of Customer Has Only a Link to Navigate to the Next Page

Figura 4 la prima pagina del cliente ha solo un collegamento per passare alla pagina successiva

Quando si fa clic sul collegamento e passare alla pagina successiva, si noterà che ora sono disponibili collegamenti per passare alla pagina precedente o successiva (vedere nella figura 5).

image: A Single Page of Customers with Navigation Links to Go to Previous or Next Page of Customers

Figura 5 una sola pagina di clienti con i collegamenti di navigazione per passare alla pagina precedente o successiva dei clienti

Il passaggio successivo, naturalmente, sarà per lavorare con una finestra di progettazione per rendere più attraente il paging.

Moltissima importanza la casella degli strumenti

Conclusioni, sebbene esistano numerosi strumenti per semplificare il paging del lato client, ad esempio l'estensione di DataTables jQuery e il nuova applicazione Web ASP.NET MVC 3 WebGrid, le esigenze dell'applicazione potrebbero non sempre beneficiare reinserimento di grandi quantità di dati. La possibilità di eseguire il paging del lato server efficiente è un componente fondamentale della casella degli strumenti. Entity Framework e ASP.NET MVC per formare un utente di grande esperienza e allo stesso tempo semplifica le attività di sviluppo per estrarre questo.

Julie Lerman è un Microsoft MVP, mentore e consulente .NET che risiede nel Vermont. È possibile trovare le sue presentazioni relative all'accesso ai dati e altri argomenti su Microsoft .NET in occasioni di conferenze che si tengono in tutto il mondo. Un blog Lerman al thedatafarm.com/blog ed è l'autore del libro "Programming Entity Framework" (o ' Reilly Media, 2009) apprezzato. È possibile seguire i suoi a Twitter.com/julielerman.

Grazie all'esperto tecnico riportato di seguito per la revisione di questo articolo: vishal joshi