Можно ли просто удалить 1 значение параметра запроса? (Я думаю о воссоздании списка значений без значения, которое мы хотим удалить, используя RouteValueDictionary и IUrlHelper.ActionContext.HttpContext.Request.Query, но я надеюсь, что есть более простой способ).
Пример:
Исходный запрос: localhost:5555/search?cat=none&cat=cat1&cat=cat2
Требуемый запрос (удаление cat1): localhost:5555/search?cat=none&cat=cat2
@ Эми, я не понимаю твой вопрос.
Вы знаете, что такое конвейер Asp.Net является?
Неа. Нужно ли мне знать, что это такое, чтобы выполнять такую "простую" задачу?
Ответ зависит от того, когда вы ожидаете, что это произойдет. Вы можете написать промежуточное программное обеспечение Owin, использовать фильтр действий веб-API, использовать делегирующий обработчик веб-API, сделать это в самом контроллере веб-API ... то, как вы это делаете, может повлиять на все, что размещено в Owin, или только веб-API, или веб-интерфейс. API и некоторый другой набор компонентов.
О, теперь я понимаю. Я хочу использовать его в контроллере (я делаю систему фильтров и хочу удалить определенный фильтр из запроса).





Один из способов сделать это внутри метода действия контроллера - это сделать следующее:
var queryParms = Request.GetQueryNameValuePairs();
GetQueryNameValuePairs - это метод расширения находится в пространстве имен System.Net.Http.
queryParms - это IEnumerable<KeyValuePair<string, string>>. Чтобы отфильтровать его, вы можете использовать LINQ:
var queryParms = Request
.GetQueryNameValuePairs()
.Where(kvp => kvp.Key != "excluded key");
Чтобы отфильтровать по паре ключ / значение:
var queryParms = Request
.GetQueryNameValuePairs()
.Where(kvp => kvp.Key != "excluded key" && kvp.Value != "excluded value");
Это дает вам список пар ключ / значение, исключая нежелательный параметр запроса. Если вы хотите исключить список ключей, вы можете использовать следующий вариант вышеуказанного:
var excludedKeys = new[] { "excluded a", "excluded b", "etc" };
var queryParms = Request
.GetQueryNameValuePairs()
.Where(kvp => !excludedKeys.Contains(kvp.Key));
Если вам нужно менять или заменять значение параметра запроса:
var queryParms = Request.GetQueryNameValuePairs();
var cat = queryParms.FirstOrDefault(x=> x.Key == "cat");
if (cat != null && cat.Value == "cat1")
{
cat.Value = "none";
}
// other stuff with query parms
После того, как у вас есть параметры запроса, которые вам нужны, вам нужно будет восстановить URL-адрес. Для этого я обращаюсь к очень хорошему ответу на другой вопрос:
https://stackoverflow.com/a/1877016/47589
Это удаляет весь параметр запроса, если вы посмотрите на мой пример, я хочу удалить только одно конкретное значение (cat1 в примере из none, cat1, cat2.
Тогда измените его на фильтр по Value. Общий принцип тот же.
Спасибо, но как я могу использовать это для восстановления URL-адреса?
Используйте класс Uri (или класс UriBuilder), но зачем вам это нужно?
Потому что я делаю систему фильтров, и если пользователь хочет удалить фильтр, я удалю его из запроса.
Мы уже удалили его из запроса. Зачем реконструировать новый URL?
Потому что я буду использовать его в элементе <a>. Я что-то делаю неправильно?
В каком месте конвейера Asp.Net вы ожидаете, что это произойдет?