Подтвердить что ты не робот

Как я могу удалить элемент из querystring в asp.net с помощью С#?

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

Default.aspx?Agent=10&Language=2

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

Default.aspx?Agent=20
4b9b3361

Ответ 1

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

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

Ответ 2

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

NameValueCollection filtered = new NameValueCollection(request.QueryString);
filtered.Remove("Language");

Ответ 3

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

    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 доступна только для чтения.

Ответ 4

Наконец,

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 );

Ответ 5

Мое личное предпочтение здесь заключается в переписывании запроса или работе с именемvaluecollection в нижней точке, но бывают случаи, когда бизнес-логика не делает ни те из них, которые очень полезны, а иногда и отражают действительно то, что вам нужно. В этих обстоятельствах вы можете просто отключить флаг 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);

Ответ 6

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

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");

Ответ 7

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

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

  • возьмите запрос с запроса
  • .split() it on '&'
  • верните его вместе в новую строку, обнюхивая и отбрасывая что-нибудь, начиная с "языка"

Ответ 8

Получите коллекцию запросов, проанализируйте ее в строке (name=value pair), исключая ту, которую вы хотите удалить, и назовите ее newQueryString

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

Ответ 9

  • Соберите строку запроса с помощью HttpContext.Request.QueryString. По умолчанию используется тип NameValueCollection.
  • Передайте его как строку и используйте System.Web.HttpUtility.ParseQueryString() для синтаксического анализа строки запроса (которая возвращает NameValueCollection снова).
  • Затем вы можете использовать функцию Remove() для удаления определенного параметра (используя ключ для ссылки на этот параметр для удаления).
  • Использовать параметры запроса обратно к строке и использовать 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.

Ответ 10

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

Ответ 11

Да, в .NET нет классов для редактирования строк запроса. Вам придется либо использовать Regex, либо какой-либо другой способ изменения самой строки.

Ответ 12

Если у вас уже есть строка запроса в виде строки, вы также можете использовать простые манипуляции с строкой:

int pos = queryString.ToLower().IndexOf("parameter=");
if (pos >= 0)
{
    int pos_end = queryString.IndexOf("&", pos);
    if (pos_end >= 0)   // there are additional parameters after this one
        queryString = queryString.Substring(0, pos) + queryString.Substring(pos_end + 1);
    else
        if (pos == 0) // this one is the only parameter
            queryString = "";
        else        // this one is the last parameter
            queryString=queryString.Substring(0, pos - 1);
}

Ответ 13

string queryString = "Default.aspx?Agent=10&Language=2"; //Request.QueryString.ToString();
string parameterToRemove="Language";   //parameter which we want to remove
string regex=string.Format("(&{0}=[^&\s]+|{0}=[^&\s]+&?)",parameterToRemove);
string finalQS = Regex.Replace(queryString, regex, "");

https://regexr.com/3i9vj

Ответ 14

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

using System.Collections.Specialized;

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

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

Ответ 15

Ну, у меня есть простое решение, но есть небольшой javascript.

предполагая, что строка запроса "ok = 1"

    string url = Request.Url.AbsoluteUri.Replace("&ok=1", "");
   url = Request.Url.AbsoluteUri.Replace("?ok=1", "");
  Response.Write("<script>window.location = '"+url+"';</script>");