¿Cómo obtener el parámetro de cadena de consulta del marcado MVC Razor?

81

Quiero verificar el parámetro de URL en mi marcado de Razor. Por ejemplo, ¿cómo hago algo como esto?

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

Respuestas:

120

Hilo similar

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

EDITAR 01-10-2014: Dado que esta pregunta es tan popular, esta respuesta se ha mejorado.

El ejemplo anterior solo obtendrá los valores de RouteData, por lo tanto, solo de las cadenas de consulta que son capturadas por alguna ruta registrada. Para obtener el valor de la cadena de consulta, debe llegar al actual HttpRequest. La forma más rápida es llamando (como señaló TruMan) `Request.Querystring ', por lo que la respuesta debería ser:

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

También puede verificar RouteValues ​​vs QueryString MVC?

EDITAR 05-03-2019: La solución anterior funciona para .NET Framework.
Como otros señalaron, si desea obtener el valor de la cadena de consulta en .NET Core , debe usar el Queryobjeto de la Context.Requestruta. Entonces sería:

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

Tenga en cuenta que estoy usando StringValues("1")en la declaración porque Querydevuelve StringValuesestructura en lugar de pura string. Ese es el camino más limpio para este escenario que he encontrado.

Mariusz
fuente
7
Gracias por las pistas. Esto funcionó: <div id = "wrap" class = "@ (Request.QueryString [" iframe "] ==" 1 "?" Iframe ": string.Empty)">
TruMan1
1
Agregaría el comentario de @ TruMan1 a su respuesta. En mi caso, los valores no estaban en los datos de la ruta (usando nop-commerce) pero eran accesibles a través de la solicitud.
Ian
Para aclarar, usaría Request.QueryString, por ejemplo, si la vista se muestra como consecuencia de una redirección
Chris Halcrow
Es posible que desee agregar que a partir de .NET Core 2.1 necesita cambiar ContextaHttpContext
Iván García Topete
34

Si está utilizando .net core 2.0, esto sería:

Context.Request.Query["id"]

Uso de muestra:

<a href="@Url.Action("Query",new {parm1=Context.Request.Query["queryparm1"]})">GO</a>
Florian Schaal
fuente
3
Esto da 'El nombre Contexto no existe en el contexto actual'. Sin embargo, el uso de Request.Query ["queryparm1"] funciona.
x5657
1
@ x5657 deberías publicar tu comentario como respuesta, ¡ya que fue la única solución que realmente funcionó para mí!
Jpsy
11

Se sugirió publicar esto como una respuesta, porque algunas otras respuestas dan errores como 'El nombre Contexto no existe en el contexto actual'.

Solo usando los siguientes trabajos:

Request.Query["queryparm1"]

Uso de muestra:

<a href="@Url.Action("Query",new {parm1=Request.Query["queryparm1"]})">GO</a>
x5657
fuente
2
Eso no funcionó para mí, pero esto sí: Request.QueryString
TroySteven
8

Ninguna de las respuestas funcionó para mí, estaba obteniendo "'HttpRequestBase' no contiene una definición para 'Consulta'", pero esto funcionó:

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

Creo que una solución más elegante es usar el controlador y el diccionario 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>
 }
YavgenyP
fuente
3
Esta vista se comparte entre muchos controladores. Creo que esto se complicaría si lo hiciera así en lugar de poner la lógica directamente en el marcado de Razor. También anticipo que también tendré que hacer esto en vistas parciales.
TruMan1
Una solución más elegante es devolverlo como parte de un ViewModel return View(new SomeViewModel{ IsIFrame = IFrame });
Jose Capistrano
1

Para Asp.net Core 2

ViewContext.ModelState["id"].AttemptedValue
Pradip Rupareliya
fuente
Voy a añadir que aunque se dice AttempValue- si el parametro no existe en la cadena de consulta obtendrá una excepción por lo que primero debe comprobar:@if (ViewContext.ModelState["id"] != null)...
adinas