Ответ 1
Вы также можете использовать Reflector для извлечения класса HttpValueCollection
в свой собственный и использовать его затем.
Используя следующий код, я получаю красивую форматированную строку:
Request.QueryString.ToString
Дает мне что-то вроде: & hello = world & microsoft = sucks
Но когда я использую этот код для клонирования коллекции другому объекту (того же типа), я возвращаю Type() обратно из метода ToString().
System.Collections.Specialized.NameValueCollection variables = new System.Collections.Specialized.NameValueCollection(Request.QueryString);
if (!string.IsNullOrEmpty(variables["sid"]))
variables.Remove("sid");
Response.Write(variables.ToString());
Есть ли более аккуратный способ вывода, а не поиск и построение строки вручную?
Вы также можете использовать Reflector для извлечения класса HttpValueCollection
в свой собственный и использовать его затем.
HttpValueCollection является внутренним, но вы можете использовать "var", чтобы объявить его, не извлекая его с помощью отражателя.
var query = HttpUtility.ParseQueryString(Request.Url.Query);
query["Lang"] = myLanguage; // Add or replace param
string myNewUrl = Request.Url.AbsolutePath + "?" + query;
Потому что это фактически специальный NVC, который имеет тип HTTPValueCollection. Поэтому, когда вы вызываете .ToString на нем, он знает, как правильно отформатировать его.
Почему вы хотите скопировать коллекцию QueryString в новый файл NameValueCollection?
if (!string.IsNullOrEmpty(Request.QueryString["sid"]))
Request.QueryString.Remove("sid");
Да, я ошибаюсь, это только чтение. Таким образом, суть заключается в использовании метода Remove на вашем NameValuecollection:
System.Collections.Specialized.NameValueCollection variables = new System.Collections.Specialized.NameValueCollection(Request.QueryString);
if (!string.IsNullOrEmpty(variables["sid"]))
variables.Remove("sid");
Если вам не требуется абсолютное имя NameValueCollection, словарь предлагает много той же семантики:
var variables = Request.QueryString.OfType<DictionaryEntry>()
.Where(entry => entry.Key != "sid")
.ToDictionary(entry => entry.Key, entry => entry.Value);
Request.QueryString фактически возвращает объект HttpValueCollection (что, к сожалению, является внутренним для System.Web, поэтому вы не можете это сделать).
Тем не менее, HttpValueCollection получен из NameValueCollection, и метод Remove() остается неповрежденным, поэтому вы должны иметь возможность вызвать Request.QueryString.Remove( "sid" );