Вывод манипулируемой строки QueryString в C # - PullRequest
22 голосов
/ 23 октября 2008

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

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

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

Ответы [ 6 ]

68 голосов
/ 15 сентября 2009

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

var query = HttpUtility.ParseQueryString(Request.Url.Query);
query["Lang"] = myLanguage; // Add or replace param
string myNewUrl = Request.Url.AbsolutePath + "?" + query;
8 голосов
/ 23 октября 2008

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

4 голосов
/ 23 октября 2008

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

1 голос
/ 23 октября 2008

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

var variables = Request.QueryString.OfType<DictionaryEntry>()
    .Where(entry => entry.Key != "sid")
    .ToDictionary(entry => entry.Key, entry => entry.Value);
1 голос
/ 23 октября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...