Попытка передать переменные фильтра внутри нумерации страниц - PullRequest
1 голос
/ 14 мая 2019

У меня есть представление под названием Reorder.Это список, который в основном показывает все доступные материалы.Список настолько длинный, что нам пришлось реализовать разбиение на страницы, чтобы страница загружалась без тайм-аута.Это прекрасно работает.

У нас также есть фильтр (текстовое поле), в котором пользователь может ввести число и отфильтровать список, чтобы видеть только те запасы, которые имеют запас, равный или меньший, чем желаемое количество.Теоретически, это работает нормально с вышеупомянутым фильтром.

Проблема в том, что - когда пользователь выбирает выход за пределы первой страницы результатов, фильтр остается на месте, но номер запаса сбрасывается и все расходные материалы, независимо от количества запаса, которое начинает отображаться снова.

Я пробовал несколько разных способов, но не могу понять, куда добавить строку поиска в коде нумерации страниц, чтобы она переносилась на любую страницу, которую переходит пользовательк.

Вот мой код контроллера переупорядочения

    public ActionResult Reorder(string searchString, int? page)
    {

    var supplies = db.ICS_Supplies.OrderByDescending(g => g.Supplies_ID).ToList();


    int searchValue;

    // If searchString is null (or not an int), then set our searchValue to int.MaxValue
    if (!int.TryParse(searchString, out searchValue)) searchValue = int.MaxValue;

    // var catalogs = supplies.Where(s => s.OnHand.HasValue && s.OnHand.Value <= searchValue);
    var catalogs = supplies.Where(s => s.OnHand < searchValue);

    var pageNumber = page ?? 1;
    return View(catalogs.ToPagedList(pageNumber, 10));

    }

Строка поиска передается из представления в контроллер и используется для возврата результатов, когда OnHand равно или меньше этого значения.Searcstring в конечном итоге преобразуется в searchvalue.

Должен ли я добавить searchvalue где-нибудь в этой строке?

var pageNumber = page ?? 1;
    return View(catalogs.ToPagedList(pageNumber, 10));

Ответы [ 2 ]

1 голос
/ 15 мая 2019

Возможно, не отвечая на ваш вопрос с этим, но ради производительности вы должны переместить метод .ToList() на более поздний этап кода. Прочитайте подробнее здесь об эффективном пейджинге с Linq. Перед методом .ToList() также добавьте значение поиска. Иначе сила Линка снова побеждена.

Подберите цепочку searchValue where-вашей первой строкой:

var supplies = db.ICS_Supplies.Where(s => s.OnHand < searchValue).OrderByDescending(g => g.Supplies_ID).ToList();

И переместите эту отредактированную строку ниже строки ViewBag.searchString = searchValue.

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

1 голос
/ 15 мая 2019

Я решил свою проблему, используя Viewbag для передачи переменных в @HtmlActionLink, поэтому фильтры на каждой странице меняются.Ранее я отправлял нефильтрованную модель через @HtmlActionLink, поэтому она не удалась.

Вот мой рабочий контроллер

{

        var supplies = db.ICS_Supplies.OrderByDescending(g => g.Supplies_ID).ToList();

        int searchValue;

        // If searchString is null (or not an int), then set our searchValue to int.MaxValue
        if (!int.TryParse(searchString, out searchValue)) searchValue = int.MaxValue;

        // Set Viewbag for filter

        ViewBag.searchString = searchValue;

        var catalogs = supplies.Where(s => s.OnHand < searchValue);

        var pageNumber = page ?? 1;
       // return View(catalogs = supplies.Where(s => s.OnHand < searchValue).ToPagedList(pageNumber, 10));
        return View(catalogs.ToPagedList(pageNumber, 10));

    }

И соответствующий код из представления:

<form asp-controller="Movies" asp-action="Index">
<p>
    Stock Inventory Less Than: <input type="text" name="searchString">
    <input type="submit" value="Filter" />

</p>

@Html.PagedListPager(Model, page => Url.Action("Reorder", new { page, searchString = ViewBag.searchString }))
...