Estou criando uma API RESTful usando o ASP.NET Core MVC e quero usar parâmetros de querystring para especificar a filtragem e a paginação em um recurso que retorna uma coleção.
Nesse caso, preciso ler os valores passados na string de consulta para filtrar e selecionar os resultados a serem retornados.
Eu já descobri que dentro da Get
ação do controlador acessar HttpContext.Request.Query
retorna um IQueryCollection
.
O problema é que não sei como é usado para recuperar os valores. Na verdade, pensei que a maneira de fazer era usar, por exemplo,
string page = HttpContext.Request.Query["page"]
O problema é que HttpContext.Request.Query["page"]
não retorna uma string, mas a StringValues
.
Enfim, como alguém usa o IQueryCollection
para realmente ler os valores da string de consulta?
c#
http
asp.net-core
query-string
.net-core
user1620696
fonte
fonte
Respostas:
Você pode usar
[FromQuery]
para ligar um modelo específico à string de consulta:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding
por exemplo
fonte
[FromQuery]
attrib também pode ser omitido, pois a ligação .net verificará todas as entradas de formulário e parâmetros de URL de consulta por padrão, exceto que você tem algum motivo para limitar sua origem.Você pode usar o método ToString no
IQueryCollection
qual retornará o valor desejado se um únicopage
parâmetro for especificado:se houver vários valores
?page=1&page=2
, o resultado da chamada ToString será1,2
Mas, como @ mike-g sugeriu em sua resposta, é melhor usar a ligação de modelo e não acessar diretamente o
HttpContext.Request.Query
objeto.fonte
ASP.NET Core irá ligar automaticamente
form values
,route values
equery strings
pelo nome. Isso significa que você pode simplesmente fazer isso:Fonte: Como funciona a ligação do modelo
Para sua informação, você também pode combinar as abordagens automáticas e explícitas:
fonte
Você pode apenas criar um objeto como este:
E então, no controlador, faça algo assim:
Ainda melhor, você pode criar um modelo de API a partir de:
para:
fonte
Aqui está um exemplo de código que eu usei (com uma exibição do .NET Core):
fonte
StringValues
é uma matriz de strings . Você pode obter o valor da string fornecendo um índice, por exemploHttpContext.Request.Query["page"][0]
.fonte
IQueryCollection
tem umTryGetValue()
que retorna um valor com a chave fornecida. Portanto, se você tivesse um parâmetro de consulta chamadosomeInt
, poderia usá-lo da seguinte maneira:Observe que, a menos que você tenha vários parâmetros com o mesmo nome, o
StringValues
tipo não é um problema.fonte
no núcleo .net, se você deseja acessar a string de consulta em nossa visão, use-a como
se estivermos em um local onde o @Context não esteja disponível, podemos injetá-lo como
também para cookies
fonte
Eu tenho uma solução melhor para esse problema,
var searchparams = await Request.GetSearchParams();
Eu criei uma classe estática com poucos métodos de extensão
Dessa forma, você pode acessar facilmente todos os seus parâmetros de pesquisa. Espero que isso ajude muitos desenvolvedores :)
fonte
Alguns dos comentários mencionam isso também, mas o asp net core faz todo esse trabalho para você.
Se você tiver uma string de consulta que corresponda ao nome, ela estará disponível no controlador.
https: // myapi / some-endpoint / 123? someQueryString = YayThisWorks
Ouputs:
123
YayThisWorks
fonte