Как я могу удалить элемент из querystring в asp.net с помощью С#?
Я хочу удалить запрос "Язык" с моего URL-адреса. Как я могу это сделать? (используя Asp.net 3.5, С#)
Default.aspx?Agent=10&Language=2
Я хочу удалить "Язык = 2", но язык будет первым, средним или последним. поэтому я буду иметь это
Default.aspx?Agent=20
Ответы
Ответ 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¶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
.
Ответ 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>");