Как я могу удалить элемент из строки запроса в asp.net с помощью c#?
Я хочу удалить строку запроса "язык" из моего url. Как я могу это сделать ? (используя Asp.net 3.5, c#)
Default.aspx?Agent=10&Language=2
Я хочу удалить "Language=2", но язык будет первым, средним или последним. так что я буду иметь это
Default.aspx?Agent=20
14 ответов:
я ответил a аналогичный вопрос некоторое время назад. В принципе, лучшим способом было бы использовать класс
HttpValueCollection, которымQueryStringсвойство на самом деле есть, к сожалению, оно является внутренним в .NET framework. Вы можете использовать отражатель, чтобы захватить его (и поместить его в свой класс Utils). Таким образом, вы можете манипулировать строкой запроса, как NameValueCollection, но со всеми проблемами кодирования/декодирования url-адресов, которые заботятся о вас.
HttpValueCollectionвыходитNameValueCollection, и имеет конструктор, который принимает кодированную строку запроса (амперсанды и вопросительные знаки включены), и он переопределяет aToString()метод для последующего перестроения строки запроса из базовой коллекции.
Если это 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);
- собрать строку запроса с помощью
HttpContext.Request.QueryString. По умолчанию этоNameValueCollectionтип.- приведите его в виде строки и используйте
System.Web.HttpUtility.ParseQueryString()для разбора строки запроса (который возвращаетNameValueCollectionснова).- затем вы можете использовать
Remove()функция для удаления конкретного параметра (с помощью ключа для ссылки на этот параметр для удаления).- использовать case параметры запроса обратно в строку и использовать
string.Join()чтобы отформатировать строку запроса как что-то читаемое вашим URL-адрес в качестве допустимых параметров запроса.ниже рабочий пример, где
param_to_remove- это параметр, который вы хотите удалить.Допустим, ваши параметры запроса
param1=1¶m_to_remove=stuff¶m2=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¶m2=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, "");
ну у меня есть простое решение , но есть немного 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