¿Cómo aplico el filtro al paginar en Asp.net MVC y entidad Framework?
Tengo una aplicación web que está escrita usando el framework ASP.NET MVC. En miHomecontroller
Tengo una acción llamadaIndex
que responde a unGet
solicitud. En esta acción, creo páginas usandoIPagedList
biblioteca para romper los registros en varias páginas. MiIndex@HttpGet
se parece a esto
public ActionResult Index(int? id)
{
using(var connection = new Context())
{
int pageNumber = (id ?? 1);
var presenter = new Presenter
{
Presenter = pageNumber,
Tasks = connection.Tasks.ToPagedList(pageNumber, 30),
Form = new TasksFiltersViewModel()
}
return View(presenter);
}
}
También tengo una acción llamadaIndex
que responden a laPost
solicitud que aplica algunos filtros. Entonces en elPost
solicito que haga algo como esto
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(Presenter model)
{
int pageNumber = (id ?? 1);
if (ModelState.IsValid)
{
using(var connection = new Context())
{
model.Tasks = connection.Tasks
.Where(task => task.Status == 5)
.ToPagedList(pageNumber, 30);
}
}
return View(model);
}
Esto también funciona bien a menos que el usuario haya cambiado la página, entonces los filtros están en reposo.
Así es como se ve mi clase de presentación
public class Presenter
{
public IPagedList<Task> Tasks { get; set; }
public TasksFiltersViewModel Form { get; set; }
public int PageNumber { get; set; }
public IEnumerable<SelectListItem> Statuses { get; set; }
}
¿Cómo puedo permitir que los usuarios usen las páginas mientras mantienen los filtros?
Aquí está mi VM de filtros
public class TasksFiltersViewModel
{
public int Status { get; set; }
}
La vista se ve así
@using (Html.BeginForm("Index", "Tasks", FormMethod.Post, new { @class = "form-horizontal" }))
{
@Html.AntiForgeryToken()
<div class="form-group">
@Html.LabelFor(m => m.Form.Status, new { @class = "control-label col-sm-3" })
<div class="col-sm-9">
@Html.DropDownListFor(m => m.Form.Status, Model.Statuses, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Form.Status, "", new { @class = "text-danger" })
</div>
</div>
<div class="row">
<div class="col-sm-9 col-md-push-3">
<div>
<button type="submit" class="btn btn-default">Filter</button>
</div>
</div>
</div>
}
foreach (var task in Model.Tasks)
{
<tr>
<td>@task.Name</td>
<td>@task.Type</td>
<td>@Html.ActionLink("Edit", "Details", "Task", new { @id = task.Id }, new { @class = "btn btn-primary btn-sm" })</td>
</tr>
}
@Html.PagedListPager(Model.Tasks, id => Url.Action("Index", new { id }))