Як отримати параметр рядка запиту з розмітки MVC Razor?


81

Я хочу перевірити параметр URL у моїй розмітці Razor. Наприклад, як мені зробити щось подібне:

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

Відповіді:


124

Подібна нитка

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

EDIT 01-10-2014: Оскільки це питання настільки популярне, цю відповідь вдосконалено.

У наведеному вище прикладі будуть отримані лише значення з RouteData, тому лише із рядків запитів, які потрапляють за яким-небудь зареєстрованим маршрутом. Щоб отримати значення рядка запиту, вам потрібно дістатися до поточного HttpRequest. Найшвидший спосіб - це зателефонувати (як зазначив TruMan) `Request.Querystring ', тому відповідь повинна бути такою:

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

Ви також можете перевірити RouteValues ​​проти QueryString MVC?

EDIT 03-05-2019: Наведене вище рішення працює для .NET Framework.
Як зазначали інші, якщо ви хочете отримати значення рядка запиту в .NET Core, вам потрібно використовувати Queryоб'єкт із Context.Requestшляху. Так буде:

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

Будь ласка, зверніть увагу, що я використовую StringValues("1")у виписці, оскільки Queryповертає StringValuesstruct замість pure string. Це чистий спосіб для цього сценарію, який я знайшов.


7
Дякую за підказки. Це спрацювало: <div id = "wrap" class = "@ (Request.QueryString [" iframe "] ==" 1 "?" Iframe ": string.Empty)">
— TruMan1

1
Я б додав коментар @ TruMan1 до вашої відповіді. У моєму випадку значення не були в даних маршруту (за допомогою nop-commerce), але були доступні через запит.
— Ян

Для уточнення - ви б використовували Request.QueryString, наприклад, якщо вигляд відображається як наслідок перенаправлення
— Кріс Халькроу,

1
Можливо, ви захочете додати, що, починаючи з .NET Core 2.1, вам потрібно змінити ContextнаHttpContext
— Іван Гарсія Топете

36

Якщо ви використовуєте .net core 2.0, це буде:

Context.Request.Query["id"]

Зразок використання:

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

3
Це дає "Назва контексту не існує в поточному контексті". Просто використання Request.Query ["queryparm1"] працює.
— x5657

1
@ x5657 ви повинні розмістити свій коментар як відповідь, оскільки це було єдине рішення, яке справді спрацювало для мене!
— Jpsy

11

Було запропоновано опублікувати це як відповідь, оскільки деякі інші відповіді дають помилки типу "Ім'я Контекст не існує в поточному контексті".

Просто використовуючи такі роботи:

Request.Query["queryparm1"]

Зразок використання:

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

2
Це не спрацювало для мене, але це зробило: Request.QueryString
— TroySteven

8

Жодна з відповідей не працювала для мене, я отримував "" HttpRequestBase "не містить визначення" Запиту "", але це спрацювало:

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

5

Я думаю, що більш елегантним рішенням є використання контролера та словника 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
Цю думку поділяють багато контролерів. Я думаю, це могло б стати брудно, роблячи це так, замість того, щоб вкладати логіку безпосередньо в розмітку Razor. Також я передбачаю, що мені, можливо, доведеться робити це і в часткових уявленнях.
— TruMan1

Більш елегантне рішення - повернути його як частину ViewModel return View(new SomeViewModel{ IsIFrame = IFrame });
— Хосе Капістрано 02

1

Для Asp.net Core 2

ViewContext.ModelState["id"].AttemptedValue

Я просто додам, що хоча там сказано AttempValue- якщо параметр не існує у рядку запиту, ви отримаєте виняток, тому спочатку слід перевірити:@if (ViewContext.ModelState["id"] != null)...
— adinas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.