ASP.NET MVC paginação - Passando tipos complexa de volta para o controlador?

StackOverflow https://stackoverflow.com/questions/827408

  •  05-07-2019
  •  | 
  •  

Pergunta

Atualmente estou trabalhando em um aplicativo MVC razoavelmente simples, que permite ao usuário inserir alguns dados de pesquisa, obter uma lista de resultados, em seguida, visualizar cada item etc. Está tudo indo muito bem, no entanto agora estou tentando implementar paginação, mas tendo alguns problemas.

minha forma de pesquisa utiliza HTTP GET, solicitando a ação a seguir:

public ActionResult Results(PropertySearchData data, int? page)
{
    ...
    IEnumerable<Property> search = mService.SearchProperties(data);

    ViewData["SearchData"] = data;
    return View("Results", "Site", search.ToPagedList(page ?? 0, 20));
    ...
}

A partir daqui eu edificarei a minha tabela de resultados da coleção IEnumerable passou para meu ponto de vista. Além disso, eu usei ViewData para manter os parâmetros de pesquisa para que eu possa transmiti-los quando o usuário solicita uma página diferente.

Por exemplo, para chegar à primeira página, eu gostaria de usar algo como isto:

Html.ActionLink("First", "Results", new { data = ViewData["SearchData"], page = 1 })

No entanto, quando esta ligação é gerada, o meu link é ao longo das linhas de

/Results?data=PropertySearchData&page=1

Se eu remover o parâmetro 'página' inteiramente, e apenas passar ViewData [ "SearchData"] como o meu valor de rota, o meu link é gerado como eu gostaria (ou seja, cada membro da PropertySearchData é repassada como uma string de consulta através o recurso de ligação modelo. Eu estou supondo que isto é porque a ligação modelo só pode funcionar corretamente quando você especificou um único tipo?

Eu posso ver várias razões por que motivo isso não funciona; o que eu estou tendo problemas com é trabalhar fora do caminho 'agradável' para fazer o que estou tentando fazer. Eu sei que devo estar faltando uma peça vital de compreender aqui, por isso seria muito apreciada, se eu posso obter algumas indicações sobre como abordar isso.

Note que eu realmente quero ficar com HTTP GET (já que esta é uma página de resultados de pesquisa).

Obrigado!

Foi útil?

Solução

O problema é o método auxiliar está apenas tentando é melhor para gerar algo de que você deu-lo e isso é um objeto com duas propriedades:. De dados e página

Para obter o número da página em que você poderia fazer uso de um dicionário de valor de rota (que é provavelmente o que está feito sob o capô de qualquer maneira) e fazer uso da substituição que aceita um IDictionary: -

//In some HtmlHelper extension method or something 
var searchCriteria = new RouteValueDictionary(ViewData["searchData"]);
searchCriteria.Add("page", 1);

return Html.ActionLink("First", "Results", searchCriteria)

Outras dicas

Desde data ou ViewData["SearchData"] está em instância de PropertySearchData Eu estou supondo que Html.ActionLink está chamando ToString() sobre ele e não dar o resultado que seria de esperar.

A criação de um método de extensão HtmlHelper não seria a melhor maneira de resolver isso. Não vai adicionar a funcionalidade geral, apenas mais (visual) desordem ...

O routeValues ??sobrecarga de Html.ActionLink espera que um objecto ou RouteValueCollection (IDictionary). Você agora está usando a sobrecarga de objeto (uma vez que o novo construtor {} é um objeto anônimo).

Você pode usar o seguinte para criar as routeValues ??corretas parâmetro:

new RouteValueCollection(ViewData["SearchData"]) { { "page", 1 } }

Este inicializa uma nova RouteValueCollection com os dados atuais e, em seguida, adiciona a chave 'página' com o novo valor (substituições, se ela existe em dados de pesquisa).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top