Вывод обработанного QueryString в С#

Используя следующий код, я получаю красивую форматированную строку:

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

Есть ли более аккуратный способ вывода, а не поиск и построение строки вручную?

Ответ 1

Вы также можете использовать Reflector для извлечения класса HttpValueCollection в свой собственный и использовать его затем.

Ответ 2

HttpValueCollection является внутренним, но вы можете использовать "var", чтобы объявить его, не извлекая его с помощью отражателя.

var query = HttpUtility.ParseQueryString(Request.Url.Query);
query["Lang"] = myLanguage; // Add or replace param
string myNewUrl = Request.Url.AbsolutePath + "?" + query;

Ответ 3

Потому что это фактически специальный NVC, который имеет тип HTTPValueCollection. Поэтому, когда вы вызываете .ToString на нем, он знает, как правильно отформатировать его.

Ответ 4

Почему вы хотите скопировать коллекцию 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");

Ответ 5

Если вам не требуется абсолютное имя NameValueCollection, словарь предлагает много той же семантики:

var variables = Request.QueryString.OfType<DictionaryEntry>()
    .Where(entry => entry.Key != "sid")
    .ToDictionary(entry => entry.Key, entry => entry.Value);

Ответ 6

Request.QueryString фактически возвращает объект HttpValueCollection (что, к сожалению, является внутренним для System.Web, поэтому вы не можете это сделать).

Тем не менее, HttpValueCollection получен из NameValueCollection, и метод Remove() остается неповрежденным, поэтому вы должны иметь возможность вызвать Request.QueryString.Remove( "sid" );