Como fazer paginação e filtragem em aplicações MVC
-
06-07-2019 - |
Pergunta
Eu estou usando o exemplo martijn Boland do à página.
O url do meu aplicativo muda quando eu clicar sobre os números de página:
http://localhost:1202/Issue?page=6
Até aí tudo bem.
O problema é quando eu adicionar um dropdownlist que submete sobre a mudança, não posso página, bem como filtro.
Se eu mudar minha suspensa, eu deveria passar o projectId na querysting, minha opinião partail irá atualizar e exibir minhas recoreds filtrados.
Agora, quando eu página o parâmetro de filtro não ficar na querystring, bem como a seleção no meu suspenso não se ater.
Como posso página, bem como filtro?
index.aspx
<form id="form-post-project-selection" class="post-comments" method="get">
<label for="Country">Project:</label>
<%= Html.DropDownList("ProjectList", "--All--") %>
</form>
<% Html.RenderPartial("MyIssues", Model); %>
<script type="text/javascript">
$("#form-post-project-selection").submit(function(evt) {
var frm = $("#form-post-project-selection");
var action = frm.attr("action");
var serializedForm = frm.serialize();
var projectId = jQuery.trim($("ProjectList").val());
if (projectId.length < 1 || projectId == "-1")
return;
});
$("#ProjectList").change(function() {
$("#form-post-project-selection").submit();
});
</script>
Solução
Eu acho que você tem um par de opções aqui.
A primeira seria a de usar Ajax para chamar de volta a um controlador para obter uma "paginado" coleção objeto de volta para que cada vez que você filtrar a saída você postback o ID do filtro para obter apenas as coleções resultados que você precisa para a página que você quer. Você poderia fazer a paginação com o Ajax, bem passar de volta o ID do filtro com a chamada Ajax assim que você vai ter a volta objeto filtrado e paginado ou você pode redirecionar para uma URL diferente na paginação explicado abaixo.
Se você usar postback de página inteira para o servidor sobre a alteração do valor na lista suspensa então você poderia redirecionar o usuário para outra url com o ID de filtro nele por exemplo. Emissão / Filtro / 1
Desta forma, cada vez que os links de paginação são usados ??você vai acabar com um url como Issue / Filtro / 1? Page = 6 e você não iria perder o seu filtro.
Por favor, note a exibição da página não precisa variar.
Tudo bem que as extremidades de função até a mesma a resposta a esta pergunta é nos comentários abaixo e postado aqui para facilidade.
<%= Html.Pager(ViewData.Model.PageSize, ViewData.Model.PageNumber, ViewData.Model.TotalItemCount, new { categoryname = ViewData["CategoryDisplayName"] } )%>