ASP.NET MVC - Abrufen von QueryString-Werten

75

Sollten Sie unter ASP.NET MVC QueryString-Parameter genauso abrufen wie in ASP.NET WebForms? oder wird die [AcceptVerbs(HttpVerbs.Get)]deklaration irgendwie benutzt?

BuddyJoe
quelle

Antworten:

119

Abfragezeichenfolgenparameter können einfach mithilfe eines Arguments für die Aktion akzeptiert werden

public ActionResult Foo(string someValue, int someOtherValue) {...}

das wird eine Abfrage wie akzeptieren .../someroute?someValue=abc&someOtherValue=123

Ansonsten können Sie die Anfrage direkt nach mehr Kontrolle durchsuchen.

Marc Gravell
quelle
Verhindert dies Angriffe auf Abfragezeichenfolgen? wie jede Skriptinjektion?
Hamza Khanzada
Was ist in diesem Fall "Someroute"?
Igor Meszaros
32

Ich denke, was Sie suchen, ist

Request.QueryString["QueryStringName"]

und Sie können in Ansichten darauf zugreifen, indem Sie hinzufügen @

Schauen Sie sich jetzt mein Beispiel an. Ich habe mit QueryString eine URL generiert

 var listURL = '@Url.RouteUrl(new { controller = "Sector", action = "List" , name = Request.QueryString["name"]})';

Der listURL-Wert ist /Sector/List?name=value'

und wann queryStringist leer

listURL Wert ist /Sector/List

Basheer AL-MOMANI
quelle
25

Sie können Request.QueryStringSammlungen immer wie Webformulare verwenden, MVC kann sie jedoch auch verarbeiten und als Parameter übergeben. Dies ist der vorgeschlagene Weg, da dies einfacher ist und der Eingabedatentyp automatisch überprüft wird.

Mehrdad Afshari
quelle
7

Ich empfehle, die ValueProvider-Eigenschaft des Controllers zu verwenden, ähnlich wie UpdateModel / TryUpdateModel, um die erforderlichen Routen-, Abfrage- und Formularparameter zu extrahieren. Dadurch wird verhindert, dass Ihre Methodensignaturen möglicherweise sehr groß werden und häufigen Änderungen unterliegen. Dies erleichtert auch das Testen ein wenig, da Sie dem Controller während Unit-Tests einen ValueProvider zur Verfügung stellen können.

Tvanfosson
quelle
1

Tatsächlich können Sie Abfragezeichenfolgen in MVC auf zwei Arten erfassen .....

public ActionResult CrazyMVC(string knownQuerystring)
{

  // This is the known query string captured by the Controller Action Method parameter above
  string myKnownQuerystring = knownQuerystring;

  // This is what I call the mysterious "unknown" query string
  // It is not known because the Controller isn't capturing it
  string myUnknownQuerystring = Request.QueryString["unknownQuerystring"];

  return Content(myKnownQuerystring + " - " + myUnknownQuerystring);

}

Dies würde beide Abfragezeichenfolgen erfassen ... zum Beispiel:

/CrazyMVC?knownQuerystring=123&unknownQuerystring=456

Output: 123 - 456

Fragen Sie mich nicht, warum sie es so gestaltet haben. Sinnvoller wäre es, wenn sie das gesamte Controller-Aktionssystem für einzelne Abfragezeichenfolgen ausschalten und nur eine erfasste dynamische Liste aller Zeichenfolgen / codierten Dateiobjekte für die URL durch URL-Formularcodierung zurückgeben würden, sodass Sie problemlos auf alle in einem Aufruf zugreifen können . Vielleicht kann jemand hier das demonstrieren, wenn es möglich ist?

Für mich macht es keinen Sinn, wie Controller Abfragezeichenfolgen erfassen, aber es bedeutet, dass Sie mehr Flexibilität beim Erfassen von Abfragezeichenfolgen haben, als sie Ihnen sofort beibringen. Also wählen Sie Ihr Gift ... beide funktionieren gut.

Stokely
quelle