c# - Как сохранять фильтр при пагинации? ASP.NET MVC

144
02 августа 2019, 03:00

Необходимо при переходе на другую страницу, запомнить то, что произошло на первой. То есть фильтрацию таблицы. И соответственно будет уменьшение количества страниц. Как можно решить данную проблему?

Класс для фильтрации и пагинации:

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>

Answer 1

Я вижу такое решение:

  1. Возвращаешь вьюху
  2. Пользователь делает всю необходимую фильтрацию
  3. Далее AJAX запросами при переходе со страницы на страницу пересылаешь фильтр в контроллер и возвращаешь частичное представление

Еще одним решением будет-это сохранять фильтр в Сессии

Answer 2

Я воспользовался 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"] }))
READ ALSO
Сборщик мусора c# не очищает память

Сборщик мусора c# не очищает память

Есть статичный метод

145
Laravel Выбор таблицы при авторизации

Laravel Выбор таблицы при авторизации

При авторизации нужно обратится именно в ту таблицу которая была выбрана при входе

122