Ich erstelle eine RESTful-API mit ASP.NET Core MVC und möchte Querystring-Parameter verwenden, um das Filtern und Paging einer Ressource anzugeben, die eine Sammlung zurückgibt.
In diesem Fall muss ich die im Querystring übergebenen Werte lesen, um zu filtern und die zurückzugebenden Ergebnisse auszuwählen.
Ich habe bereits herausgefunden, dass innerhalb der Controller- Get
Aktion der Zugriff eine HttpContext.Request.Query
zurückgibt IQueryCollection
.
Das Problem ist, dass ich nicht weiß, wie es zum Abrufen der Werte verwendet wird. In Wahrheit dachte ich, der Weg wäre zum Beispiel die Verwendung von
string page = HttpContext.Request.Query["page"]
Das Problem ist, dass HttpContext.Request.Query["page"]
keine Zeichenfolge zurückgegeben wird, sondern eine StringValues
.
Wie benutzt man das IQueryCollection
, um die Querystring-Werte tatsächlich zu lesen?
quelle
Antworten:
Sie können
[FromQuery]
ein bestimmtes Modell an den Querystring binden:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding
z.B
quelle
[FromQuery]
Attribut kann auch weggelassen werden, da die .net-Bindung standardmäßig alle Formulareingaben und URL-Querystring-Parameter überprüft, außer dass Sie einen Grund haben, die Quelle einzuschränken.Sie können die ToString-Methode verwenden, bei
IQueryCollection
der der gewünschte Wert zurückgegeben wird, wenn ein einzelnerpage
Parameter angegeben wird:Wenn es mehrere Werte wie gibt,
?page=1&page=2
ist das Ergebnis des ToString-Aufrufs1,2
Aber wie @ mike-g in seiner Antwort vorgeschlagen hat, sollten Sie besser die Modellbindung verwenden und nicht direkt auf das
HttpContext.Request.Query
Objekt zugreifen .quelle
ASP.NET - Core automatisch binden
form values
,route values
undquery strings
nach dem Namen. Dies bedeutet, dass Sie dies einfach tun können:Quelle: Funktionsweise der Modellbindung
Zu Ihrer Information, Sie können auch die automatischen und expliziten Ansätze kombinieren:
quelle
Sie können einfach ein Objekt wie folgt erstellen:
Und dann in Controller einfach so etwas machen:
Noch besser ist, dass Sie ein API-Modell erstellen können aus:
zu:
quelle
Hier ist ein Codebeispiel, das ich verwendet habe (mit einer .NET Core-Ansicht):
quelle
StringValues
ist ein Array von Zeichenfolgen . Sie können Ihren Zeichenfolgenwert erhalten, indem Sie einen Index angeben, zHttpContext.Request.Query["page"][0]
.quelle
IQueryCollection
hat einTryGetValue()
drauf, das einen Wert mit dem angegebenen Schlüssel zurückgibt. Wenn Sie also einen Abfrageparameter namens habensomeInt
, können Sie ihn folgendermaßen verwenden:Beachten Sie, dass der
StringValues
Typ kein Problem darstellt , es sei denn, Sie haben mehrere Parameter mit demselben Namen .quelle
Wenn Sie in .net Core auf Querystring zugreifen möchten, verwenden Sie es in unserer Ansicht wie folgt
Wenn wir uns an einem Ort befinden, an dem @Context nicht verfügbar ist, können wir es wie folgt injizieren
auch für Cookies
quelle
Ich habe eine bessere Lösung für dieses Problem,
var searchparams = await Request.GetSearchParams();
Ich habe eine statische Klasse mit wenigen Erweiterungsmethoden erstellt
Auf diese Weise können Sie einfach auf alle Ihre Suchparameter zugreifen. Ich hoffe das wird vielen Entwicklern helfen :)
quelle
Einige der Kommentare erwähnen dies ebenfalls, aber asp net core erledigt all diese Arbeit für Sie.
Wenn Sie eine Abfragezeichenfolge haben, die dem Namen entspricht, ist diese im Controller verfügbar.
https: // myapi / some-endpoint / 123? someQueryString = YayThisWorks
Ausgaben:
123
YayThisWorks
quelle