Pagination in the modal using Url.Action

2

I have a modal of products, in the controller of the page has a get function to complete it when it opens, and a post for filters and pagination. My problem that pagination is done by Url.Action("Index", new { page }) that calls the page below my modal and not the products page and if I put in place of the index my modal does not work because it will call my get method and not the post .

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult _PopUpProdutos(ProdutoIndexViewModel produtoIndexViewModel)
    {
        var _produtotipoRepository = new ProdutoTipoRepository();
        var _produtogrupoRepository = new ProdutoGrupoRepository();
        var _produtofamiliaRepository = new ProdutoFamiliaRepository();
        var _fabricanteRepository = new FabricanteRepository();

        var filiais = _filialRepository.GetAllAtivo();
        var filiaisViewModels = Mapper.Map<IEnumerable<Filial>, IEnumerable<FilialViewModel>>(filiais);

        var produtoTipos = _produtotipoRepository.GetAllAtivo();
        var produtoTiposViewModels = Mapper.Map<IEnumerable<ProdutoTipo>, IEnumerable<ProdutoTipoViewModel>>(produtoTipos);

        var produtoGrupos = _produtogrupoRepository.GetAllAtivo();
        var produtoGruposViewModels = Mapper.Map<IEnumerable<ProdutoGrupo>, IEnumerable<ProdutoGrupoViewModel>>(produtoGrupos);

        var produtoFamilias = _produtofamiliaRepository.GetAllAtivo();
        var produtoFamiliasViewModels = Mapper.Map<IEnumerable<ProdutoFamilia>, IEnumerable<ProdutoFamiliaViewModel>>(produtoFamilias);

        var fabricantes = _fabricanteRepository.GetAllAtivo();
        var fabricantesViewModels = Mapper.Map<IEnumerable<Fabricante>, IEnumerable<FabricanteViewModel>>(fabricantes);

        var produtosFilters = Mapper.Map<ProdutoFilterViewModel, ProdutoFilter>(produtoIndexViewModel.Filters);
        var produtos = _produtoRepository.GetAllFilterAtivo(produtosFilters);

        var produtoDetailsViewModels = Mapper.Map<IEnumerable<Produto>, IEnumerable<ProdutoDetailsViewModel>>(produtos);

        if (!produtoIndexViewModel.IsPageChange)
        {
            produtoIndexViewModel.Page = 1;
        }

        int pageSize = WebConfig.PageSize;
        int pageNumber = (produtoIndexViewModel.Page ?? 1);

        produtoIndexViewModel.Filters.Filiais = filiaisViewModels;
        produtoIndexViewModel.Filters.ProdutoTipos = produtoTiposViewModels;
        produtoIndexViewModel.Filters.ProdutoGrupos = produtoGruposViewModels;
        produtoIndexViewModel.Filters.ProdutoFamilias = produtoFamiliasViewModels;
        produtoIndexViewModel.Filters.Fabricantes = fabricantesViewModels;
        produtoIndexViewModel.Results = produtoDetailsViewModels.ToPagedList(pageNumber, pageSize);
        ModelState.Remove("IsPageChange");
        produtoIndexViewModel.IsPageChange = false;

        ViewBag.NavigationMenuPrimary = NavigationMenuPrimary;
        ViewBag.NavigationMenuSecondary = NavigationMenuSecondary;
        ViewBag.NavigationMenuTertiary = NavigationMenuTertiary;

        return PartialView("_PopUpProdutos", produtoIndexViewModel);
    } 
    
asked by anonymous 05.10.2015 / 21:53

1 answer

1

In its place, it would change everything to GET . I would quit POST , even because forms accept GET .

To preserve parameters, I recommend implementing the following extension for UrlHelper :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MeuProjeto.Extensions
{
    public static class UrlHelperExtensions
    {
        public static string ActionQuery(this UrlHelper urlHelper,
            string action, string controller)
        {
            return ActionQuery(urlHelper, action, controller, null);
        }

        public static string ActionQuery(this UrlHelper urlHelper,
            string action, string controller, object routeValues)
        {
            var queryString =
                urlHelper.RequestContext.HttpContext.Request.QueryString;

            var newRoute = routeValues == null
                ? urlHelper.RequestContext.RouteData.Values
                : new RouteValueDictionary(routeValues);

            foreach (string key in queryString.Keys)
            {
                if (!newRoute.ContainsKey(key))
                    newRoute.Add(key, queryString[key]);
            }

            return UrlHelper.GenerateUrl("Default", action, controller, newRoute, 
                urlHelper.RouteCollection, urlHelper.RequestContext, true);
        }
    }
}

Usage:

@Url.ActionQuery(ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), new { page }))

Try to make a debug to understand how it works. All GET parameters of the previous request will be preserved, except page , which will be modified.

    
05.10.2015 / 21:59