Outputting a manipulated QueryString in C#

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

Request.QueryString.ToString 

Дает мне что-то вроде: & привет = мир & Microsoft= отстой

Но когда я использую этот код для клонирования коллекции в другой объект (того же типа), я получаю 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());

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

6 ответов

Решение

Вы также можете использовать 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 для вашей коллекции NameValue:

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

Другие вопросы по тегам