Параметры строки запроса полезны, когда у вас есть несколько необязательных параметров, и вы не хотите включать значения по умолчанию для неуказанных параметров просто для удовлетворения пути.
И вам не нужно делать ничего особенного, чтобы включить эти параметры в отображаемый URL.
Возьмите следующий маршрут, например:
routes.MapRoute
(
"QuestionsTagged",
"questions/tagged/{tag}",
new { controller = "Questions", action = "Tagged" }
);
Если вы отображаете ссылку на этот маршрут, используя:
Url.RouteUrl
(
"QuestionsTagged",
new
{
tag = "java",
page = 9802,
sort = "newest",
pagesize = 15
}
)
... тогда механизм маршрутизации достаточно умен, чтобы видеть, что маршрут содержит параметр с именем tag
и что объект переданных значений маршрута также имеет нечто с именем tag
, поэтому он использует это значение в маршруте.
Любые предоставленные значения маршрута, которые не имеют соответствующие параметры в маршруте (page
, sort
и pagesize
в этом случае), привязываются как параметры строки запроса. Таким образом, Url.RouteUrl
вызов выше вернет /questions/tagged/java?page=9802&sort=newest&pagesize=15
.
И ваш метод действия может явно перечислить эти параметры в своей подписи (повышает удобочитаемость и удобство обслуживания), или вы можете получить к ним доступ через Request.QueryString
.
public class QuestionsController : Controller
{
// I can explicitly list the parameters in my signature and let routing do
// its magic, like this...
public ViewResult Tagged(string tag, int? page, int? pagesize)
{
// ...or I can grab parameters like this:
string sort = Request.QueryString["sort"];
return View();
}
}
Обратите внимание, что параметры метода действия не обязательно должны соответствовать параметрам, указанным в маршруте. (В маршруте я указал только tag
, но списки сигнатур метода действия tag
, page
и pagesize
.) Однако любой параметр метода действия, который также не является параметром маршрута, должен быть ссылочным или обнуляемым типом.