it-swarm.com.de

Wie kann man Werte aus dem Querstring mit ASP.NET Core lesen?

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?

59
user1620696

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)
{...}
60
Mike_G

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.

51
Darin Dimitrov

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

  1. Form values: Dies sind Formularwerte, die in der HTTP-Anforderung mit der Methode POST gespeichert werden. (einschließlich jQuery POST -Anfragen).

  2. Route values: Die von Routing bereitgestellten Routenwerte

  3. 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)
{ ... }
10
spottedmahn

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")
    {
    }
}
10
Pavel

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.

5
steamrolla

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..
}
3
Mariusz

StringValues ist ein Array von Strings . Sie können Ihren Zeichenfolgewert abrufen, indem Sie einen Index angeben, z. HttpContext.Request.Query["page"][0].

3
Constantinos G.

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"]
0
M.Ali El-Sayed