Потеря текущего фильтра в PagedList
Может кто-нибудь, пожалуйста, помогите мне и скажите мне, где я иду не так. У меня есть панель инструментов, которая показывает список ошибок. Вверху есть текстовое поле с type="date"
позволяя пользователю выбрать дату. Затем список обновляется, чтобы показать ошибки, произошедшие в выбранную дату. Я хочу реализовать PagedList для этого, но когда я нажимаю на вторую страницу, он не показывает никаких результатов вообще
контроллер
public ActionResult Index(string sortOrder, int? page)
{
ViewBag.CurrentSort = sortOrder;
ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";
var applications = from s in db.ElmahErrors
where s.TimeUtc == DateTime.Today
select s;
switch (sortOrder)
{
default:
applications = applications.OrderByDescending(x => x.TimeUtc);
break;
}
int pageSize = Int32.Parse(System.Configuration.ConfigurationManager.AppSettings["DefaultPageSize"]);
int pageNumber = (page ?? 1);
return View(applications.ToPagedList(pageNumber, pageSize));
}
[HttpPost]
public ActionResult Index(string sortOrder, string currentFilter, int? page)
{
ViewBag.CurrentSort = sortOrder;
ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";
DateTime userSelectedDate = DateTime.Parse(Request["datePicker"]).Date;
string dateString = userSelectedDate.ToString("yyyy-MM-dd");
if (dateString != null)
{
page = 1;
}
else
{
dateString = currentFilter;
}
ViewBag.CurrentFilter = dateString;
var startDate = userSelectedDate.Date;
var endDate = startDate.AddDays(1);
var applications = from s in db.ElmahErrors
//where s.TimeUtc >= startDate && s.TimeUtc < endDate
select s;
if (!String.IsNullOrEmpty(dateString))
{
applications = applications.Where(s => s.TimeUtc >= startDate && s.TimeUtc < endDate);
}
switch (sortOrder)
{
default:
applications = applications.OrderByDescending(x => x.TimeUtc);
break;
}
int pageSize = Int32.Parse(System.Configuration.ConfigurationManager.AppSettings["DefaultPageSize"]);
int pageNumber = (page ?? 1);
return View(applications.ToPagedList(pageNumber, pageSize));
}
Посмотреть
@model PagedList.IPagedList<DataIntelligence.Models.ElmahError>
@using PagedList.Mvc;
<link href="Content/PagedList.css" rel="stylesheet" type="text/css" />
@{
ViewBag.Title = "Errors By Day";
}
<div class="jumbotron">
<h2>Errors By Day</h2>
</div>
@using (Html.BeginForm("Index", "Day", FormMethod.Post, new { id = "frmSearch" }))
{
<label for="datePicker">Find By Date:</label>
@Html.TextBox("datePicker", ViewBag.CurrentFilter as string, new { @type = "date"})
}
<script>
$("#datePicker").change(function () {
$("#frmSearch").submit();
});
</script>
<table>
<tr>
<th>
Application
</th>
<th>
Host
</th>
<th>
Type
</th>
<th>
Date
</th>
<th>
Message
</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td style="width:400px;">
<a href="@Url.Action("Details", new { id=item.ErrorId})"> @Html.DisplayFor(modelItem => item.Application) </a>
</td>
<td>
@Html.DisplayFor(modelItem => item.Host)
</td>
<td style="width:550px;">
@Html.DisplayFor(modelItem => item.Type)
</td>
<td>
@Html.DisplayFor(modelItem => item.TimeUtc)
</td>
<td>
@{
string parameterValue = item.Message.Substring(0, 8);
}
@Html.DisplayFor(modelItem => parameterValue)
</td>
</tr>
}
</table>
<br />
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
@Html.PagedListPager(Model, page => Url.Action("Index",
new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))
Я пытался измениться с POST
в GET
но я не могу понять, как заставить это работать.
Может кто-нибудь посоветовать мне, что изменить, чтобы заставить работать мой PagedList?
Заранее спасибо.
1 ответ
PagedList, как и большинство модулей подкачки, которые вы можете найти, использует GET, а не POST, когда вы нажимаете на следующую страницу. Таким образом, запрос приходит не к действию, помеченному HttpPost
, но по умолчанию. Поэтому фильтр даты не применяется, и вы получаете вторую страницу с сегодняшними ошибками. Я предполагаю, что сегодня было недостаточно ошибок (хорошо, да?), Чтобы заполнить вторую страницу данными.
Я бы порекомендовал вам переключиться на одно действие, которое обрабатывает только запросы GET. В конце концов, это рекомендуемый способ для идемпотентных операций, таких как просмотр данных. POST следует использовать, в идеале, только при изменении данных на сервере.