Wie erhalte ich einen Abfragezeichenfolgenparameter aus dem MVC Razor-Markup?

81

Ich möchte den URL-Parameter in meinem Razor-Markup überprüfen. Wie mache ich zum Beispiel so etwas:

<div id="wrap" class="@{if (URL "IFRAME" PARAMETER EQUALS 1) iframe-page}">
TruMan1
quelle

Antworten:

118

Ähnlicher Thread

<div id="wrap" class=' @(ViewContext.RouteData.Values["iframe"] == 1 ? /*do sth*/ : /*do sth else*/')> </div>

EDIT 01-10-2014: Da diese Frage so beliebt ist, wurde diese Antwort verbessert.

Das obige Beispiel RouteDatabezieht nur die Werte von , also nur von den Abfrageringen, die von einer registrierten Route abgefangen werden. Um den Querystring-Wert zu erhalten, müssen Sie zum aktuellen Wert gelangen HttpRequest. Der schnellste Weg besteht darin, "Request.Querystring" anzurufen (wie TruMan betonte). Die Antwort sollte also lauten:

<div id="wrap" class=' @(Request.QueryString["iframe"] == 1 ? /*do sth*/ : /*do sth else*/')> </div>

Sie können auch RouteValues ​​vs QueryString MVC überprüfen ?

EDIT 03-05-2019: Die obige Lösung funktioniert für .NET Framework.
Wie andere wiesen darauf hin , wenn Sie möchten , Query - String - Wert bekommen .NET - Core Sie verwenden müssen QueryObjekt aus Context.RequestPfad. So wäre es:

<div id="wrap" class=' @(Context.Request.Query["iframe"] == new StringValues("1") ? /*do sth*/ : /*do sth else*/')> </div>

Bitte beachten Sie Ich bin mit StringValues("1")der Aussage , weil Querykehrt StringValuesanstelle von reinem struct string. Das ist ein sauberer Weg für dieses Szenario, das ich gefunden habe.

Mariusz
quelle
7
Danke für die Hinweise. Dies funktionierte: <div id = "wrap" class = "@ (Request.QueryString [" iframe "] ==" 1 "?" Iframe ": string.Empty)">
TruMan1
1
Ich würde den Kommentar von @ TruMan1 zu Ihrer Antwort hinzufügen. In meinem Fall waren die Werte nicht in den Routendaten (über Nop-Commerce), sondern über die Anfrage zugänglich.
Ian
Zur Verdeutlichung - Sie würden Request.QueryString zum Beispiel verwenden, wenn die Ansicht als Folge einer Umleitung angezeigt wird
Chris Halcrow
Man könnte diesen Anfang mit hinzufügen möchten .NET - Core 2.1 Sie ändern müssen , ContextumHttpContext
Ivan García Topete
33

Wenn Sie .net Core 2.0 verwenden, ist dies:

Context.Request.Query["id"]

Beispielnutzung:

<a href="@Url.Action("Query",new {parm1=Context.Request.Query["queryparm1"]})">GO</a>
Florian Schaal
quelle
3
Dies ergibt 'Der Name Kontext existiert im aktuellen Kontext nicht'. Die Verwendung von Request.Query ["queryparm1"] funktioniert jedoch.
x5657
1
@ x5657 du solltest deinen Kommentar als Antwort posten, da es die einzige Lösung war, die wirklich für mich funktioniert hat!
Jpsy
11

Es wurde vorgeschlagen, dies als Antwort zu veröffentlichen, da einige andere Antworten Fehler wie "Der Name Kontext existiert im aktuellen Kontext nicht" enthalten.

Verwenden Sie einfach die folgenden Werke:

Request.Query["queryparm1"]

Beispielnutzung:

<a href="@Url.Action("Query",new {parm1=Request.Query["queryparm1"]})">GO</a>
x5657
quelle
2
Das hat bei mir nicht funktioniert, aber das hat funktioniert: Request.QueryString
TroySteven
8

Keine der Antworten funktionierte für mich, ich bekam "'HttpRequestBase' enthält keine Definition für 'Abfrage'", aber das hat funktioniert:

HttpContext.Current.Request.QueryString["index"]
Rolando Retana
quelle
5

Ich denke, eine elegantere Lösung ist die Verwendung des Controllers und des ViewData-Wörterbuchs:

//Controller:
public ActionResult Action(int IFRAME)
    {
        ViewData["IsIframe"] = IFRAME == 1;
        return View();
    }

//view
@{
    string classToUse = (bool)ViewData["IsIframe"] ? "iframe-page" : "";
   <div id="wrap" class='@classToUse'></div>
 }
YavgenyP
quelle
3
Diese Ansicht wird von vielen Controllern gemeinsam genutzt. Ich denke, das würde so chaotisch werden, anstatt die Logik direkt in das Razor-Markup zu setzen. Ich gehe auch davon aus, dass ich dies möglicherweise auch in Teilansichten tun muss.
TruMan1
Eine elegantere Lösung ist die Rückgabe als Teil eines ViewModel return View(new SomeViewModel{ IsIFrame = IFrame });
Jose Capistrano
1

Für Asp.net Core 2

ViewContext.ModelState["id"].AttemptedValue
Pradip Rupareliya
quelle
Ich füge nur hinzu, obwohl es heißt AttempValue- wenn der Parameter nicht in der Abfragezeichenfolge vorhanden ist, erhalten Sie eine Ausnahme, so dass Sie zuerst überprüfen sollten:@if (ViewContext.ModelState["id"] != null)...
adinas