Необходимо при переходе на другую страницу, запомнить то, что произошло на первой. То есть фильтрацию таблицы. И соответственно будет уменьшение количества страниц. Как можно решить данную проблему?
Класс для фильтрации и пагинации:
public class HomeRepairListViewModel
{
public IEnumerable<HomeRepair> HomeRepairs { get; set; }
public SelectList Status { get; set; }
public PageInfo PageInfo { get; set; }
}
Код контроллера:
public ActionResult Index(string status, int page = 1)
{
var owners = db.Owners;
ViewBag.Owners = owners;
IQueryable<HomeRepair> homeRepairs = db.HomeRepairs;
if (!String.IsNullOrEmpty(status) && !status.Equals("Все"))
{
homeRepairs = homeRepairs.Where(p => p.RepairStatus == status);
}
int pageSize = 2;
homeRepairs = homeRepairs.OrderBy(p => p.Id)
.Skip((page - 1) * pageSize)
.Take(pageSize);
PageInfo pageInfo = new PageInfo { PageNumber = page, PageSize = pageSize, TotalItems = db.HomeRepairs.Count() };
HomeRepairListViewModel hrlv = new HomeRepairListViewModel
{
HomeRepairs = homeRepairs.ToList(),
Status = new SelectList(new List<string>()
{
"Все",
"Ремонт запланирован",
"Начат",
"Окончен"
}),
PageInfo = pageInfo
};
return View(hrlv);
}
Хелпер для пагинации:
public static MvcHtmlString PageLinks(this HtmlHelper html, PageInfo pageInfo, Func<int,string> pageUrl)
{
StringBuilder result = new StringBuilder();
for (int i = 1; i <= pageInfo.TotalPages; i++)
{
TagBuilder tag = new TagBuilder("a");
tag.MergeAttribute("href", pageUrl(i));
tag.InnerHtml = i.ToString();
if (i == pageInfo.PageNumber)
{
tag.AddCssClass("selected");
tag.AddCssClass("btn-primary");
}
tag.AddCssClass("btn btn-default");
result.Append(tag.ToString());
}
return MvcHtmlString.Create(result.ToString());
}
Фрагменты кода Index.cshtml : Вызов хелпера
<div class="btn-group">
@Html.PageLinks(Model.PageInfo, x => Url.Action("Index", new { page = x }))</div>
Форма для фильтрации
<h1>Список домов</h1>
<form method="get">
<div class="form-inline">
<label class="control-label">Статус ремонта</label>
@Html.DropDownList("status", Model.HomeRepairs as SelectList,
htmlAttributes: new { @class = "form-control" })
<input type="submit" value="Фильтр" class="btn btn-default" />
</div>
</form>
Я вижу такое решение:
AJAX
запросами при переходе со страницы на страницу пересылаешь фильтр в контроллер и возвращаешь частичное представлениеЕще одним решением будет-это сохранять фильтр в Сессии
Я воспользовался Session, спасибо, iluxa1810.
Добавил в методе контроллера Session["status"] = status;
Поменял местами
PageInfo pageInfo = new PageInfo { PageNumber = page, PageSize = pageSize, TotalItems = homeRepairs.Count() };
и
homeRepairs = homeRepairs.OrderBy(p => p.Id)
.Skip((page - 1) * pageSize)
.Take(pageSize);`
чтобы правильно считало количество страниц и изменил передачу параметров
@Html.PageLinks(Model.PageInfo, (x) => Url.Action("Index", "Home", new { page = x, status = Session["status"] }))
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
При авторизации нужно обратится именно в ту таблицу которая была выбрана при входе