Як отримати параметр рядка запиту з розмітки 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.