Ich baue eine RESTful-API mit ASP.NET Core MVC und möchte mit Querystring-Parametern Filterung und Paging für eine Ressource angeben, die eine Sammlung zurückgibt.
In diesem Fall muss ich die in der Querzeichenfolge übergebenen Werte lesen, um zu filtern, und die Ergebnisse auswählen, die zurückgegeben werden sollen.
Ich habe bereits herausgefunden, dass im Controller Get
die Aktion, die auf HttpContext.Request.Query
zugreift, eine IQueryCollection
zurückgibt.
Das Problem ist, dass ich nicht weiß, wie es verwendet wird, um die Werte abzurufen. In Wahrheit dachte ich, der Weg wäre zum Beispiel die Verwendung
string page = HttpContext.Request.Query["page"]
Das Problem ist, dass HttpContext.Request.Query["page"]
keine Zeichenfolge zurückgibt, sondern eine StringValues
.
Wie verwendet man IQueryCollection
tatsächlich, um die Querstring-Werte tatsächlich zu lesen?
Sie können [FromQuery]
verwenden, um ein bestimmtes Modell an den Querstring zu binden:
https://docs.Microsoft.com/de-de/aspnet/core/mvc/models/model-binding
z.B.
[HttpGet()]
public IActionResult Get([FromQuery(Name = "page")] string page)
{...}
Sie können die ToString-Methode für IQueryCollection
verwenden, die den gewünschten Wert zurückgibt, wenn ein einzelner page
-Parameter angegeben wird:
string page = HttpContext.Request.Query["page"].ToString();
wenn mehrere Werte wie ?page=1&page=2
vorhanden sind, lautet das Ergebnis des ToString-Aufrufs 1,2
.
Wie in @ mike-g in seiner Antwort vorgeschlagen, sollten Sie jedoch die Modellbindung verwenden und nicht direkt auf das HttpContext.Request.Query
-Objekt zugreifen.
ASP.NET Core bindet form values
, route values
und query strings
automatisch anhand des Namens. Das bedeutet, dass Sie dies einfach tun können:
[HttpGet()]
public IActionResult Get(int page)
{ ... }
MVC versucht, die Anforderungsdaten anhand des Namens an die Aktionsparameter zu binden. Nachfolgend finden Sie eine Liste der Datenquellen in der Reihenfolge, in der die Modellbindung sie durchläuft
Form values
: Dies sind Formularwerte, die in der HTTP-Anforderung mit der Methode POST gespeichert werden. (einschließlich jQuery POST -Anfragen).
Route values
: Die von Routing bereitgestellten Routenwerte
Query strings
: Der Abfragezeichenfolge-Teil des URI.
Quelle: So funktioniert die Modellbindung
Zu Ihrer Information können Sie auch die automatischen und expliziten Ansätze kombinieren:
[HttpGet()]
public IActionResult Get(int page
, [FromQuery(Name = "page-size")] int pageSize)
{ ... }
Hier ist ein Codebeispiel, das ich verwendet habe (mit einer .NET Core-Ansicht):
@{
Microsoft.Extensions.Primitives.StringValues queryVal;
if (Context.Request.Query.TryGetValue("yourKey", out queryVal) &&
queryVal.FirstOrDefault() == "yourValue")
{
}
}
IQueryCollection
hat eine TryGetValue()
, die einen Wert mit dem angegebenen Schlüssel zurückgibt. Wenn Sie einen Abfrageparameter mit dem Namen someInt
hätten, könnten Sie ihn wie folgt verwenden:
var queryString = httpContext.Request.Query;
StringValues someInt;
queryString.TryGetValue("someInt", out someInt);
var daRealInt = int.Parse(someInt);
Beachten Sie, dass der Typ StringValues
kein Problem ist, es sei denn, Sie haben mehrere Parameter mit demselben Namen.
Sie können einfach ein Objekt wie folgt erstellen:
public class SomeQuery
{
public string SomeParameter { get; set; }
public int? SomeParameter2 { get; set; }
}
Und dann im Controller einfach so etwas machen:
[HttpGet]
public IActionResult FindSomething([FromQuery] SomeQuery query)
{
// Your implementation goes here..
}
StringValues
ist ein Array von Strings . Sie können Ihren Zeichenfolgewert abrufen, indem Sie einen Index angeben, z. HttpContext.Request.Query["page"][0]
.
wenn Sie in .net Core auf Querystring zugreifen möchten, verwenden Sie sie wie
@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor
@if (HttpContextAccessor.HttpContext.Request.Query.Keys.Contains("yourKey "))
{
<text>do something </text>
}
auch für kekse
HttpContextAccessor.HttpContext.Request.Cookies["DeniedActions"]