Как получить все активные параметры в ASP.NET MVC (2) - PullRequest
2 голосов
/ 15 апреля 2010

Мне было интересно, есть ли способ создать ActionLink или аналогичный, который изменяет только несколько параметров фактического запроса и сохраняет все остальные параметры без изменений. Например, если я нахожусь по URL-адресу типа http://example.com/Posts/Index?Page=5&OrderBy=Name&OrderDesc=True, я хочу изменить только параметр Page или OrderBy и оставить все остальные параметры такими же, даже те, о которых я еще не знаю (например, когда я хочу добавить параметр Search или что-то подобное).

Заголовок моего текущего действия выглядит так:

public ActionResult Index(int? Page, string OrderBy, bool? Desc)

и меня интересуют только значения, которые этот контроллер "ест". Однако я хочу, чтобы при расширении этого действия (например, с помощью параметра string Search) ссылки работали так же, как и раньше.

Вот что я уже сделал:

  1. Создайте новый RouteValueDictionary и заполните его всем, начиная с RouteData.Values
    • Проблема: заполняются только те параметры, которые используются в маршрутизации, поэтому все остальные дополнительные параметры (например, Page) для контроллера теряются
  2. Добавить все из HttpContext.Request.QueryString в предыдущий словарь
    • Это то, что я сейчас использую
    • Проблема: у него могут быть какие-то ненужные вещи, которые Контроллер не запрашивал, и он не работает, если страница была загружена с использованием POST. У вас также нет привязок ModelBindings (но это не большая проблема, потому что мы все равно пересылаем все)
  3. Использование HttpContext.Request.Params
    • Проблема: в нем слишком много ненужных данных, которые имхо не следует добавлять в RouteValueDictionary, который передается в ActionLink

Итак, вопросы:

  1. Есть ли RVD, в котором есть все данные, которые были переданы в контроллер и использовались им?
  2. Является ли это решение хорошим или есть какие-то предостережения, о которых я не задумывался (в основном в контексте изменения нескольких параметров запроса при сохранении остальных нетронутыми)?
  3. Есть ли способ отфильтровать "ненужные" данные из объекта Params?

EDIT: проверил переменную RouteData.DataTokens, но обычно она пуста и не содержит всего, что мне нужно. Кажется, он содержит только параметры, необходимые для маршрутизации, но не все параметры.

1 Ответ

0 голосов
/ 15 апреля 2010

Загляните в RouteData.DataTokens.

RouteData.DataTokens @ документация MSDN :

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

HTHS,
Charles

...