Как я могу удалить элемент из строки запроса в asp.net с помощью C #? - PullRequest
52 голосов
/ 09 февраля 2009

Я хочу удалить строку запроса "Language" из моего URL. Как я могу это сделать ? (используя Asp.net 3.5, c #)

Default.aspx?Agent=10&Language=2

Я хочу удалить «Language = 2», но язык будет первым, средним или последним. так что у меня будет это

Default.aspx?Agent=20

Ответы [ 15 ]

114 голосов
/ 09 февраля 2009

Если это HttpRequest.QueryString, то вы можете скопировать коллекцию в доступную для записи коллекцию и получить доступ к ней.

NameValueCollection filtered = new NameValueCollection(request.QueryString);
filtered.Remove("Language");
44 голосов
/ 23 сентября 2011

Вот простой способ. Отражатель не нужен.

    public static string GetQueryStringWithOutParameter(string parameter)
    {
        var nameValueCollection = System.Web.HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString());
        nameValueCollection.Remove(parameter);
        string url = HttpContext.Current.Request.Path + "?" + nameValueCollection;

        return url;
    }

Здесь QueryString.ToString() требуется, поскольку Request.QueryString коллекция доступна только для чтения.

36 голосов
/ 10 февраля 2009

Наконец,

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

Я взял HttpValueCollection с помощью Reflector и написал следующий код

        var hebe = new HttpValueCollection();
        hebe.Add(HttpUtility.ParseQueryString(Request.Url.Query));

        if (!string.IsNullOrEmpty(hebe["Language"]))
            hebe.Remove("Language");

        Response.Redirect(Request.Url.AbsolutePath + "?" + hebe );
26 голосов
/ 08 октября 2009

Мое личное предпочтение здесь - переписать запрос или работать с коллекцией namevalue на более низком уровне, но бывают моменты, когда бизнес-логика не делает ничего из этого очень полезной, и иногда рефлексия действительно является тем, что вам нужно. В этих обстоятельствах вы можете просто отключить флаг readonly, например, так:

// reflect to readonly property
PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);

// make collection editable
isreadonly.SetValue(this.Request.QueryString, false, null);

// remove
this.Request.QueryString.Remove("foo");

// modify
this.Request.QueryString.Set("bar", "123");

// make collection readonly again
isreadonly.SetValue(this.Request.QueryString, true, null);
10 голосов
/ 09 февраля 2009

Я ответил на похожий вопрос некоторое время назад. По сути, лучшим способом было бы использовать класс HttpValueCollection, который на самом деле является свойством QueryString, к сожалению, он является внутренним в фреймворке .NET. Вы можете использовать Reflector, чтобы захватить его (и поместить в свой класс Utils). Таким образом, вы можете манипулировать строкой запроса, например, NameValueCollection, но с учетом всех проблем кодирования / декодирования URL-адреса.

HttpValueCollection расширяет NameValueCollection и имеет конструктор, который принимает зашифрованную строку запроса (включая амперсанды и вопросительные знаки) и переопределяет метод ToString() для последующего перестроения строки запроса из базовой коллекции.

3 голосов
/ 11 июня 2013

Попробуйте это ...

PropertyInfo isreadonly   =typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);    

isreadonly.SetValue(this.Request.QueryString, false, null);
this.Request.QueryString.Remove("foo");
1 голос
/ 01 марта 2016
  1. Соберите строку запроса, используя HttpContext.Request.QueryString. По умолчанию используется тип NameValueCollection.
  2. Приведите его в строку и используйте System.Web.HttpUtility.ParseQueryString() для анализа строки запроса (которая снова возвращает NameValueCollection).
  3. Затем можно использовать функцию Remove() для удаления определенного параметра (используйте клавишу для ссылки на этот параметр для удаления).
  4. Используйте регистр параметров запроса обратно в строку и используйте string.Join(), чтобы отформатировать строку запроса как нечто, читаемое вашим URL как допустимые параметры запроса.

Рабочий пример приведен ниже, где param_to_remove - параметр, который вы хотите удалить.

Допустим, параметры вашего запроса param1=1&param_to_remove=stuff&param2=2. Запустите следующие строки:

var queryParams = System.Web.HttpUtility.ParseQueryString(HttpContext.Request.QueryString.ToString());
queryParams.Remove("param_to_remove");
string queryString = string.Join("&", queryParams.Cast<string>().Select(e => e + "=" + queryParams[e]));

Теперь ваша строка запроса должна быть param1=1&param2=2.

1 голос
/ 09 февраля 2009

Получить коллекцию строки запроса, разобрать ее в строку (name=value pair), исключая ту, которую вы хотите УДАЛИТЬ, и назвать ее newQueryString

Затем позвоните Response.Redirect(known_path?newqueryString);

1 голос
/ 09 февраля 2009

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

... В этом случае это пограничный тривиал.

  • получить строку запроса из запроса
  • .split () это на '&'
  • соберите его обратно в новую строку, отыскивая и выбрасывая все, что начинается с "language"
0 голосов
/ 30 апреля 2019

Анализ строки запроса в коллекции NameValueCollection. Удалить предмет. И используйте toString, чтобы преобразовать его обратно в строку запроса.

using System.Collections.Specialized;

NameValueCollection filteredQueryString = System.Web.HttpUtility.ParseQueryString(Request.QueryString.ToString());
filteredQueryString.Remove("appKey");

var queryString = '?'+ filteredQueryString.ToString();
...