Jak uzyskać parametr ciągu zapytania ze znaczników MVC Razor?


81

Chcę sprawdzić parametr adresu URL w moim znaczniku Razor. Na przykład, jak zrobić coś takiego:

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

Odpowiedzi:


124

Podobny wątek

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

EDYCJA 01-10-2014: Ponieważ to pytanie jest tak popularne, ta odpowiedź została ulepszona.

Powyższy przykład pobierze wartości tylko z RouteData, a więc tylko z kwerend, które są przechwytywane przez jakąś zarejestrowaną trasę. Aby uzyskać wartość querystring, musisz dostać się do prądu HttpRequest. Najszybszym sposobem jest wywołanie (jak wskazał TruMan) `Request.Querystring ', więc odpowiedź powinna brzmieć:

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

Możesz również sprawdzić RouteValues ​​vs QueryString MVC?

EDYCJA 03-05-2019: Powyższe rozwiązanie działa dla .NET Framework.
Jak wskazywali inni, jeśli chcesz uzyskać wartość ciągu zapytania w .NET Core , musisz użyć Queryobiektu ze Context.Requestścieżki. Tak więc byłoby:

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

Zwróć uwagę, że używam StringValues("1")w oświadczeniu, ponieważ Queryzwraca StringValuesstruct zamiast pure string. To oczyszcza sposób na ten scenariusz, który znalazłem.


7
Dzięki za podpowiedzi. To zadziałało: <div id = "wrap" class = "@ (Request.QueryString [" iframe "] ==" 1 "?" Iframe ": string.Empty)">
TruMan1

1
Dodałbym komentarz @ TruMan1 do Twojej odpowiedzi. W moim przypadku wartości nie znajdowały się w danych trasy (przy użyciu nie-commerce), ale były dostępne za pośrednictwem żądania.
Ian

Aby wyjaśnić - użyjesz Request.QueryString na przykład, jeśli widok jest wyświetlany jako konsekwencja przekierowania
Chris Halcrow

1
Możesz dodać, że zaczynając od .NET Core 2.1 , musisz zmienić ContextnaHttpContext
Ivan García Topete

36

Jeśli używasz .net core 2.0, będzie to:

Context.Request.Query["id"]

Przykładowe użycie:

<a href="@Url.Action("Query",new {parm1=Context.Request.Query["queryparm1"]})">GO</a>

3
Daje to „Nazwa Kontekst nie istnieje w obecnym kontekście”. Jednak samo użycie Request.Query ["queryparm1"] działa.
x5657

1
@ x5657 powinieneś zamieścić swój komentarz jako odpowiedź, ponieważ było to jedyne rozwiązanie, które naprawdę zadziałało!
Jpsy,

11

Zaproponowano opublikowanie tego jako odpowiedzi, ponieważ niektóre inne odpowiedzi zawierają błędy, takie jak „Nazwa Kontekst nie istnieje w obecnym kontekście”.

Używając tylko następujących prac:

Request.Query["queryparm1"]

Przykładowe użycie:

<a href="@Url.Action("Query",new {parm1=Request.Query["queryparm1"]})">GO</a>

2
To nie zadziałało, ale to
zadziałało

8

Żadna z odpowiedzi nie zadziałała dla mnie, otrzymywałem „HttpRequestBase” nie zawiera definicji zapytania „Query” ”, ale to zadziałało:

HttpContext.Current.Request.QueryString["index"]

5

Myślę, że bardziej eleganckim rozwiązaniem jest użycie kontrolera i słownika ViewData:

//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>
 }

3
Ten widok jest współużytkowany przez wiele kontrolerów. Myślę, że zrobienie tego w ten sposób byłoby nieuporządkowane, zamiast umieszczać logikę bezpośrednio w znacznikach Razor. Przewiduję również, że będę musiał to zrobić również w widokach częściowych.
TruMan1

Bardziej eleganckim rozwiązaniem jest zwrócenie go w ramach ViewModel return View(new SomeViewModel{ IsIFrame = IFrame });
Jose Capistrano,

1

W przypadku Asp.net Core 2

ViewContext.ModelState["id"].AttemptedValue

Dodam tylko, że chociaż mówi AttempValue- jeśli parametr nie istnieje w ciągu zapytania, otrzymasz wyjątek, więc powinieneś najpierw sprawdzić:@if (ViewContext.ModelState["id"] != null)...
adinas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.