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.