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



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



Default.aspx?Agent=10&Language=2


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



Default.aspx?Agent=20
751   14  

14 ответов:

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

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

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

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

вот простой способ. Рефлектор не нужен.

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

наконец,

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

Я хватаю HttpValueCollection с помощью рефлектора и написал следующий код

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ну у меня есть простое решение , но есть немного 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>");

Comments

    Ничего не найдено.