Мне было интересно, есть ли способ создать 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
) ссылки работали так же, как и раньше.
Вот что я уже сделал:
- Создайте новый
RouteValueDictionary
и заполните его всем, начиная с RouteData.Values
- Проблема: заполняются только те параметры, которые используются в маршрутизации, поэтому все остальные дополнительные параметры (например,
Page
) для контроллера теряются
- Добавить все из
HttpContext.Request.QueryString
в предыдущий словарь
- Это то, что я сейчас использую
- Проблема: у него могут быть какие-то ненужные вещи, которые Контроллер не запрашивал, и он не работает, если страница была загружена с использованием POST. У вас также нет привязок ModelBindings (но это не большая проблема, потому что мы все равно пересылаем все)
- Использование
HttpContext.Request.Params
- Проблема: в нем слишком много ненужных данных, которые имхо не следует добавлять в
RouteValueDictionary
, который передается в ActionLink
Итак, вопросы:
- Есть ли
RVD
, в котором есть все данные, которые были переданы в контроллер и использовались им?
- Является ли это решение хорошим или есть какие-то предостережения, о которых я не задумывался (в основном в контексте изменения нескольких параметров запроса при сохранении остальных нетронутыми)?
- Есть ли способ отфильтровать "ненужные" данные из объекта
Params
?
EDIT: проверил переменную RouteData.DataTokens
, но обычно она пуста и не содержит всего, что мне нужно. Кажется, он содержит только параметры, необходимые для маршрутизации, но не все параметры.