Филтър и пагинация в MVC 4

Беше дълъг ден за мен, опитвайки се да разбера това и вярвам, че винаги има отговор на stackoverflow. Търсих публикации, които са подобни, но предполагам, че никоя няма това, което отчаяно търся. Това е сделката, имам този MVC 4 проект, върху който работя, но се натъкнах на някои проблеми, които ме накараха да го отворя. Използването на IPageList за страниране на моя MVC е доста готино, но как мога да продължа да странизирам резултата, филтриран с помощта на същия контейнер ActionResult за индекса. Ето код за вечеря.

public ActionResult Index(int? page, int category = 0)
     {
         int pageSize = 10;
         int pageNumber = (page ?? 1);
         if (category != 0)
         {
             var products = (from p in db.Products where p.ProductID == category select p).OrderBy(x => x.ProductName).ToList();
             return View(products.ToPagedList(pageNumber, pageSize));
         }
         else
         {
             var products = (from p in db.Products select p).OrderBy(x => x.ProductName).ToList();
             return View(products.ToPagedList(pageNumber, pageSize));
         }
     }

По принцип категорията int е стойността, получена от падащия списък. Филтрира перфектно, но проблемът е, когато филтрирам и резултатите са по-големи от 10 и се опитам да отида на следващата страница, той се връща към първоначалния резултат на индекса. Отстранявайки грешки, разбрах, че след като се щракне върху next, стойността на int category се изчиства и той влиза в блока else. Ето контролата за пейджинг, може би има нещо, което трябва да се коригира...

<div>Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber)
of @Model.PageCount

@if (Model.HasPreviousPage)
{
    @Html.ActionLink("<<", "Index", new { page = 1, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter  })
    @Html.Raw(" ");
    @Html.ActionLink("< Prev", "Index", new { page = Model.PageNumber - 1, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter  })
}
else
{
    @:<<
    @Html.Raw(" ");
    @:< Prev
}

@if (Model.HasNextPage)
{
    @Html.ActionLink("Next >", "Index", new { page = Model.PageNumber + 1, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter  })
    @Html.Raw(" ");
    @Html.ActionLink(">>", "Index", new { page = Model.PageCount, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter  })
}
else
{
    @:Next >
    @Html.Raw(" ")
    @:>>
}

Това, от което се нуждая, е филтрираните резултати, върнати на страницата, да отговарят на пейджинг. Ще чакам отговори. Благодаря!


person Oluwafemi    schedule 08.11.2012    source източник
comment
опитайте MVC 4 Пейджинг на този MVC 4 Пейджинг с bootstrap или без bootstrap дизайн също има различни опции като ItemTexts, TooltipTitles, Size, Alignment, IsShowControls, ItemIcon, metro css, поддържани области.   -  person Sender    schedule 18.07.2013


Отговори (3)


Във вашия контейнер за действие, задайте ViewBag.CurrentFilter = category;, като приемем, че CurrentFilter е категория

person Suhas    schedule 08.11.2012
comment
не работи... категорията загуби стойност при страниране и нулата се предава обратно към CurrentFilter - person Oluwafemi; 09.11.2012

С помощта на предишния отговор и коментар, даден от Suhas, успях да изляза с по-ясно и по-добро решение. Ето окончателното решение:

public ActionResult Index(int? page, int category = 0)
 {
     int pageSize = 10;
     int pageNumber = (page ?? 1);
     if (category != 0)
     {
         ViewBag.CurrentFilter = category;
         var products = (from p in db.Products where p.ProductID == category select p).OrderBy(x => x.ProductName).ToList();
         return View(products.ToPagedList(pageNumber, pageSize));
     }
     else
     {
         var products = (from p in db.Products select p).OrderBy(x => x.ProductName).ToList();
         return View(products.ToPagedList(pageNumber, pageSize));
     }
 }

Надявам се, че ще помогне на другите. Suhas заслужава оценката. наздраве!

NB: Коментарът на Suhas под това решение има голямо значение.

person Oluwafemi    schedule 09.11.2012
comment
Все още смятам, че това е ненужно. Ако category и CategoryFilter съдържат една и съща стойност и са присвоени един от друг, тогава не е необходимо да поддържате двете променливи. Трябва само да зададете ViewBag.CurrentFilter = category и да промените параметъра на низа на заявката в маркера за закрепване на category от currentFilter. - person Suhas; 09.11.2012
comment
Току-що видях коментара ви... Ако работи, ще редактирам моя код и ще маркирам вашия като отговор... Наздраве! - person Oluwafemi; 09.11.2012

public PartialViewResult AllProducts(int? page, int? currentFilter, int cid = 0)
{
    ViewBag.cid = cid;
    int pageSize = 4;
    int pageIndex = 1;
    pageIndex = page.HasValue ? Convert.ToInt32(page) : 1;
    if (currentFilter != 0 && cid == 0)
    {
        cid = Convert.ToInt32(currentFilter);
    }
    if (cid != 0)
    {
        ViewBag.CurrentFilter = cid;
        ViewBag.AllProducts = _unitOfWork.GetRepositoryInstance<tbl_Products>().GetAllRecordsIQueryable().Where(i => i.IsDelete == false && i.CategoryId == cid).ToList().ToPagedList(pageIndex, pageSize);
        return PartialView("AllProducts", ViewBag.AllProducts);
    }
    else
    {
        ViewBag.AllProducts = _unitOfWork.GetRepositoryInstance<tbl_Products>().GetAllRecordsIQueryable().Where(i => i.IsDelete == false).ToList().ToPagedList(pageIndex, pageSize);
        return PartialView("AllProducts", ViewBag.AllProducts);
    }
}

Ето идеалния код за този проблем.

person sandip parmar    schedule 13.08.2018
comment
Можете ли да обясните как това помага за решаването на проблема? Един блок с обикновен код сам по себе си не е толкова информативен - person CertainPerformance; 13.08.2018