Home > Blockchain >  After filtering/sorting how to make the pagination not reset to page 1 but stay at current page?
After filtering/sorting how to make the pagination not reset to page 1 but stay at current page?

Time:10-22

I'm using PagedList library for pagination and also have ordering and filtering. The problem is that after submit of order/filter request the pagination resets to page 1 but I have to keep it at current page? How can this be achieved? I also don't know if this is the right behavior but I was told to it is.

This is my controller:

public class ProductSearchBlockController : BlockController<ProductSearchBlock>
{
    private readonly IRepository<Products> _productsRepository;

    public ProductSearchBlockController(IRepository<Products> productsRepository)
    {
        _productsRepository = productsRepository;
    }

    public override ActionResult Index(ProductSearchBlock currentBlock)
    {
        if (Session[SessionConstants.Products] == null)
        {
            Session[SessionConstants.Products] = _productsRepository.All();
        }

        var sessionProducts = Session[SessionConstants.Products] as IEnumerable<Products>;

        var searchString = Request.QueryString.Get(RequestQuerryConstants.SearchString);
        var orderBy = Request.QueryString.Get(RequestQuerryConstants.OrderBy);
        var pageNumber = Request.QueryString.Get(RequestQuerryConstants.PageNumber);

        if (string.IsNullOrEmpty(orderBy))
        {
            orderBy = "default";
        }

        if (!string.IsNullOrEmpty(searchString))
        {
            var result = sessionProducts.Where(p => p.OrganizaitonId.Contains(searchString) ||
            p.ProductName.Contains(searchString)).ToList();

            Session[SessionConstants.ProductsResult] = result;
        }
        else
        {
            var result = sessionProducts.ToList();
            Session[SessionConstants.ProductsResult] = result;
        }

        var productsResult = Session[SessionConstants.ProductsResult] as List<Products>;

        productsResult = TableDisplayHelper.OrderedProducts(orderBy, productsResult);
        
        var viewModel = new ProductSearchBlockViewModel();

        viewModel.Products = productsResult.ToPagedList(int.Parse(pageNumber), 2);
        viewModel.PageNumber = int.Parse(pageNumber);
        viewModel.OrderBy = orderBy;
        viewModel.FilterBy = searchString;
        viewModel.Options = currentBlock.Options;

        return PartialView(viewModel);
    }

    public ActionResult GetTableData(string searchString, string orderBy, int? page)
    {
        if (searchString == null && orderBy == null)
        {
            return Redirect(PageHelper.CurrentPageUrl());
        }

        if (searchString != null)
        {
            page = 1;
        }

        int pageNumber = page ?? 1;

        var orderByQuerry = UriUtil.AddQueryString(PageHelper.CurrentPageUrl(), RequestQuerryConstants.OrderBy, orderBy.ToString());
        var SearchStringQuerry = UriUtil.AddQueryString(orderByQuerry, RequestQuerryConstants.SearchString, searchString);
        var finalUrl = UriUtil.AddQueryString(SearchStringQuerry, RequestQuerryConstants.PageNumber, pageNumber.ToString());

        return Redirect(finalUrl);
    }

This is the view:

<div class="block esproductsearchblock col-lg-12 col-md-12 col-sm-12 col-xs-12  ">
<div class="es-product-search-block es-product-search-block-index b-spacing-default fonts-regular template-base block-wrapper">
    <div class="template-search-block wrapper-fullsize" data-is-pagination-enabled="True" style="opacity: 1; pointer-events: auto;">
        <section class="product-search wrapper-940" style="opacity: 1; pointer-events: auto;">
            @using (Html.BeginForm("GetTableData", "ProductSearchBlock", FormMethod.Get))
            {
                <span>Order By</span>

                <select id="orderBySelect" name="orderBy" aria-hidden="true">
                    @if (Model.Options != null)
                    {
                        foreach (var item in Model.Options)
                        {
                            if (Model.OrderBy == item.Trim().ToLower())
                            {
                                <option value="@item" selected>@item</option>
                            }

                            else
                            {
                                <option value="@item">@item</option>
                            }
                        }
                    }

                </select>
                <div class="search-field bottom-aligned-m">
                    <input id="search-field-inputid" class="search-field-input" name="searchString" placeholder="Search" value="@Model.FilterBy">
                    <i class="fa fa-close"></i>
                </div>
                <button class="btn">Submit Search</button>
                <a class="btn" href="/ProductSearchBlock/GetTableData">Clear Search</a>
                <div id="distribution-status-filter" data-distribution-status-filter-id="251" data-distributon-status-options="Phased out,Mature,Active"></div>
            }
        </section>

        <div class="search-results-table wrapper-940">
            <section class="results">
                <div class="products">                        
                    @foreach (var product in Model.Products)
                    {
                    <div class="product product-data">
                        <div class="title-container">
                            <p class="product-name">@product.ProductName</p>
                        </div>
                        <div class="group">
                            <p class="indication">@product.OrganizaitonId</p>
                        </div>
                        <div class="price">
                            <h6>Price per Unit</h6>
                            <p class="small-text bold">
                                @product.Price <span class="product-price__currency-marker">€</span>
                            </p>
                        </div>
                        @using (Html.BeginForm("AddToCart", "ProductSearchBlock", FormMethod.Get))
                        {
                            <div class="float-container">
                                <div class="float-child">
                                    <h6>Quantity</h6>
                                    <input min="1" style="width:50%" type="number" name="quantity" value="0">
                                    <input hidden type="number" name="id" value="@product.Id">
                                </div>
                                <div class="float-child">
                                    <button class="cart-btn primary-btn">Add</button>
                                </div>
                            </div>                                
                        }

                    </div>}
                </div>
                    @Html.PagedListPager(Model.Products, page => Url.Action("GetTableData", "ProductSearchBlock",
                    new 
                    {
                        page,
                        orderBy = Model.OrderBy,
                        searchString = Model.FilterBy
                    }),
                    new PagedListRenderOptions 
                    {  
                        ContainerDivClasses = new List<string> { "pagination" }, LiElementClasses = new List<string> { "paginationSpan" } 
                    });

            </section>
        </div>
    </div>
</div>

CodePudding user response:

Found a solution maybe there is a better version but current one works.

Added parameter pageNumber to form and changed form to post:

@using (Html.BeginForm("GetTableData", "ProductSearchBlock", new { pageNumber=Model.PageNumber}, FormMethod.Post))

In controller get the current page number and check if exists set page to current page

public ActionResult GetTableData(string searchString, string orderBy, int? page)
    {
        var currentPage = Request.QueryString.Get(RequestQuerryConstants.PageNumber);

        if (searchString == null && orderBy == null)
        {
            return Redirect(PageHelper.CurrentPageUrl());
        }

        if(currentPage != null)
        {
            page = int.Parse(currentPage);
        }

        var orderByQuerry = UriUtil.AddQueryString(PageHelper.CurrentPageUrl(), RequestQuerryConstants.OrderBy, orderBy.ToString());
        var SearchStringQuerry = UriUtil.AddQueryString(orderByQuerry, RequestQuerryConstants.SearchString, searchString);
        var finalUrl = UriUtil.AddQueryString(SearchStringQuerry, RequestQuerryConstants.PageNumber, page.ToString());

        return Redirect(finalUrl);
    }
  • Related