Добавление? Param = в маршруты mvc - PullRequest
7 голосов
/ 09 августа 2011

Некоторые сайты MVC имеют параметры строки запроса, добавленные к URL-адресу маршрута (из которых я заметил StackOverflow), например:

https://stackoverflow.com/questions/tagged/java?page=9802&sort=newest&pagesize=15

Каковы преимущества наличия параметров в качестве более обычных? Params строки запроса, а не / param / values ​​/?

Кроме того, как эти параметры добавляются к настроенным маршрутам? Я знаком с настройкой маршрутов mvc с такими параметрами, как «users / details / {id}» и т. Д., Но не знаю, как настроить маршруты для использования с 1 или более параметрами? Как в приведенном выше примере url?

Ответы [ 2 ]

5 голосов
/ 10 августа 2011

Параметры строки запроса полезны, когда у вас есть несколько необязательных параметров, и вы не хотите включать значения по умолчанию для неуказанных параметров просто для удовлетворения пути.

И вам не нужно делать ничего особенного, чтобы включить эти параметры в отображаемый 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.) Однако любой параметр метода действия, который также не является параметром маршрута, должен быть ссылочным или обнуляемым типом.

1 голос
/ 09 августа 2011

Я обычно видел, как данные подкачки и фильтрации передаются как параметры строки запроса, поскольку они предоставляют информацию пользователю в URI.Также обычно безопасно, если пользователь изменяет эти данные, поскольку он просто фильтрует данные, которые вы видите на странице.Любые конфиденциальные данные обычно публикуются так, что их не так легко увидеть или изменить, но я бы посоветовал содержать ваш URI в чистоте и использовать как можно меньше строк запросов.

Вам не нужно делать ничего особенного, когдауказание маршрутов, чтобы иметь возможность обрабатывать цепочки запросов.Это будут просто дополнительные данные, которые передаются вашему действию.В ваших действиях вам нужно будет поработать с данными.Используя указанную выше строку запроса, вы должны будете указать имена строк запроса в качестве имен параметров, а затем любой тип данных, который вы ожидаете.

public ActionResult Index (int page, string sort, int pagesize)

В этом примере страница будет иметь значение 9802, сортировка будет «самой новой», а размер страницы будет 15.

...