Modal pagination using Url.Action

Asked

Viewed 194 times

2

I have a modal of products, in the controller page has a get function to complete it when opening, and a post for filters and pagination. My problem is that paging 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);
    } 

1 answer

1

If I were you, I’d change everything to GET. Abandoaria the POST, even because forms accept the GET.

To preserve parameters, I recommend implementing the following extension to the 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);
        }
    }
}

Use:

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

Try making a debug to understand how it works. All parameters GET of the previous requisition will be preserved, except page, that will be modified.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.