ASP.NET MVC - Отримання значень QueryString


76

У розділі ASP.NET MVC ви повинні збирати параметри QueryString так само, як і в ASP.NET WebForms? чи [AcceptVerbs(HttpVerbs.Get)]декларація якось звикає?

Відповіді:


120

Параметри рядка запиту можна прийняти, просто використовуючи аргумент дії - тобто

public ActionResult Foo(string someValue, int someOtherValue) {...}

який прийме такий запит, як .../someroute?someValue=abc&someOtherValue=123

Крім цього, ви можете переглядати запит безпосередньо, щоб отримати більше контролю.


Це запобіжить атакам рядків запитів? як будь-який ін'єкційний скрипт?
Хамза Ханзада,

Що в цьому випадку "якийсь шлях"?
Ігор Месарош

32

Я думаю, що ви шукаєте

Request.QueryString["QueryStringName"]

і ви можете отримати доступ до нього у поданнях, додавши @

тепер подивіться на мій приклад ,,, я створив URL-адресу з QueryString

 var listURL = '@Url.RouteUrl(new { controller = "Sector", action = "List" , name = Request.QueryString["name"]})';

значення listURL - /Sector/List?name=value'

а коли queryStringпорожній

Значення listURL становить /Sector/List


25

Ви завжди можете використовувати Request.QueryStringколекції, такі як веб-форми, але ви також можете змусити MVC обробляти їх і передавати їх як параметри. Це запропонований спосіб, оскільки це простіше, і він автоматично перевірить тип вхідних даних.


7

Я рекомендую використовувати властивість ValueProvider контролера, багато в чому так, як UpdateModel / TryUpdateModel для вилучення необхідних параметрів маршруту, запиту та форми. Це не дозволить вашим підписам методів зростати дуже великими і піддаватися частим змінам. Це також полегшує тестування, оскільки ви можете подавати ValueProvider на контролер під час модульних тестів.


1

Насправді ви можете захопити рядки запитів у MVC двома способами .....

public ActionResult CrazyMVC(string knownQuerystring)
{

  // This is the known query string captured by the Controller Action Method parameter above
  string myKnownQuerystring = knownQuerystring;

  // This is what I call the mysterious "unknown" query string
  // It is not known because the Controller isn't capturing it
  string myUnknownQuerystring = Request.QueryString["unknownQuerystring"];

  return Content(myKnownQuerystring + " - " + myUnknownQuerystring);

}

Це захопить обидва рядки запиту ... наприклад:

/CrazyMVC?knownQuerystring=123&unknownQuerystring=456

Output: 123 - 456

Не питайте мене, чому вони так спроектували. Було б більш розумно, якби вони викинули всю систему дій контролера для окремих рядків запитів і просто повернули захоплений динамічний список усіх рядків / кодованих файлових об’єктів для URL-адреси за допомогою url-form-encoding, щоб ви могли легко отримати доступ до всіх за один виклик . Може хтось тут може продемонструвати це, якщо це можливо?

Для мене немає сенсу в тому, як контролери захоплюють рядки запитів, але це означає, що у вас є більша гнучкість для захоплення рядків запитів, ніж вони вас навчать нестандартно. Тож вибирай свою отруту .... обидва працюють нормально.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.