Paging ASP.NET MVC, conservazione dei parametri di query correnti
-
07-07-2019 - |
Domanda
Ho una griglia con le informazioni di contatto che devo poter sfogliare.
Tutto l'impianto idraulico è già in atto , con un ultimo dettaglio. Il paging avviene tramite un semplice parametro p Querystring, ad es. www.myurl.com/grid?p=3 sarebbe la terza pagina; il repository recupera automaticamente i dati corretti e anche il conteggio totale degli elementi. La dimensione di ogni pagina è definita da qualche altra parte e non devo preoccuparmene nella stringa di query.
Tuttavia, sostengo anche la ricerca, ecc. Il termine cercato cercato è indicato con q nella mia Querystring. Quindi ora posso avere una combinazione: www.myurl.com/grid?q=tom&p=2 che cerca " tom " e tira la seconda pagina di risultati.
Il problema che sto affrontando ora, poiché i parametri q (o altri) potrebbero essere presenti nella stringa della query, come posso creare un cercapersone per questo (che dovrebbe mantenere i parametri originali, quindi se faccio clic su " pagina 2 " deve andare da
-
www.myurl.com/grid?a=1&b=xyz&q=tom
a
-
www.myurl.com/grid?a=1&b=xyz&q=tom&p=2
Come posso farlo?
Soluzione
Ho fatto una domanda simile ieri. Forse vuoi dare un'occhiata Conserva i dati in .net mvc
di seguito è riportato il codice copiato dal libro di Steve Sanderson
public static class PagingHelpers
{
public static string PageLinks(this HtmlHelper html, int currentPage,
int totalPages, Func<int, string> pageUrl)
{
StringBuilder result = new StringBuilder();
for (int i = 1; i <= totalPages; i++)
{
TagBuilder tag = new TagBuilder("a"); // Construct an <a> tag
tag.MergeAttribute("href", pageUrl(i));
tag.InnerHtml = i.ToString();
if (i == currentPage)
tag.AddCssClass("selected");
result.AppendLine(tag.ToString());
}
return result.ToString();
}
}
Altri suggerimenti
Quindi devi fare in modo che i tuoi collegamenti di pagina indirizzino l'utente allo stesso URL ma con una "pagina" diversa valore. Il modo più ovvio per farlo è fare in modo che il tuo codice che esegua il rendering di un collegamento di pagina afferri la stringa di query dalla richiesta corrente, modifichi la " page " valore e renderizza un collegamento usando la stringa modificata.
In alternativa, e questo è l'approccio che ho adottato, puoi definire un nuovo percorso per il tuo " list " pagine, che includono qualsiasi valore di paginazione e ordinamento. In questo modo fanno parte dell'URL ma sono anche molto facili da gestire nel controller.
Un esempio che include valori di ordinamento e paging potrebbe essere simile al seguente:
routes.MapRoute( "List", "{controller}/List/{pageNumber}/{sortBy}/{sortOrder}/{pageSize}", new { action = "List", sortBy = "Id", sortOrder = "Asc", pageNumber = 1, pageSize = 10 }, new { sortBy = @"[A-Za-z0-9+-]*", sortOrder = "Asc|Desc", pageNumber = @"\d{1,6}", pageSize = @"\d{1,6}" });
Ovviamente la tua " lista " il metodo di azione deve essere in grado di interpretare i valori e gestire i dati di conseguenza. Questo potrebbe non essere quello che stai cercando, ma ho pensato di buttarlo lì.
A PARTIRE: Ho anche scritto un attributo del filtro azione [Elenco] che raccoglie questi valori dalla rotta e (se il modello è una raccolta) applica automaticamente l'ordinamento e il paging in OnActionExecuted. In questo modo, tutto ciò che devo fare è recuperare i dati e impostare il modello.
Persisto i valori di ricerca per ogni modulo nella sessione. Nei metodi che rispondono alla ricerca o al paging, prima carico tutti i valori della sessione, quindi li sostituisco (e imposto i valori della sessione, se necessario) con i valori della stringa di query o dei parametri del modulo, a seconda che si tratti di get o post . In questo modo non devo preoccuparmi del codice di paging, inclusi i criteri di ricerca: utilizza semplicemente ciò che è già memorizzato. Se voglio fare una nuova ricerca, i valori nelle caselle di ricerca cambiano e la ricerca viene eseguita utilizzando un pulsante di filtro - che inizia con i risultati della pagina 1.