Generowanie zmanipulowanego zapytania w c#

Używając poniższego kodu otrzymuję ładny sformatowany ciąg znaków:

Request.QueryString.ToString 

Daje mi coś w stylu: & hello=world & microsoft=sucks

Ale kiedy używam tego kodu do sklonowania kolekcji do innego obiektu (tego samego typu), otrzymuję Type() z metody 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());

Czy istnieje bardziej uporządkowany sposób na wyjście go zamiast szukać i budować łańcuch ręcznie?

Author: Anthony Main, 2008-10-23

6 answers

Możesz również użyć Reflector, aby wyodrębnić klasę HttpValueCollection do swojej własnej, a następnie użyć jej.

 8
Author: Igal Tabachnik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-10 14:57:33

HttpValueCollection jest wewnętrzny, ale możesz użyć" var", aby zadeklarować go bez rozpakowywania za pomocą reflektora.

var query = HttpUtility.ParseQueryString(Request.Url.Query);
query["Lang"] = myLanguage; // Add or replace param
string myNewUrl = Request.Url.AbsolutePath + "?" + query;
 66
Author: Michele Bersini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-15 07:43:56

Ponieważ w rzeczywistości jest to specjalny NVC, który jest typu HTTPValueCollection. Więc kiedy zadzwonisz .ToString na nim, wie, jak poprawnie sformatować.

 4
Author: Brian Schmitt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-23 14:32:20

Dlaczego chcesz skopiować kolekcję QueryString do nowej NameValueCollection?

    if (!string.IsNullOrEmpty(Request.QueryString["sid"]))
        Request.QueryString.Remove("sid");

Tak rzeczywiście, mylę się, jest tylko do odczytu. Tak więc istotą jest użycie metody Remove na Twoim NameValuecollection:

System.Collections.Specialized.NameValueCollection variables = new System.Collections.Specialized.NameValueCollection(Request.QueryString);
if (!string.IsNullOrEmpty(variables["sid"]))
    variables.Remove("sid");
 1
Author: Johannes Hädrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-23 14:30:16

Jeśli absolutnie nie potrzebujesz NameValueCollection, słownik oferuje wiele tych samych semantyki:

var variables = Request.QueryString.OfType<DictionaryEntry>()
    .Where(entry => entry.Key != "sid")
    .ToDictionary(entry => entry.Key, entry => entry.Value);
 1
Author: Jimmy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-23 15:07:10

Prośba.QueryString faktycznie zwraca obiekt HttpValueCollection (który unfortunately, jest wewnętrzny do systemu.WWW, więc nie możesz tego zrobić).

Niemniej jednak, HttpValueCollection pochodzi z NameValueCollection, a jej metoda Remove() pozostaje nienaruszona, więc powinieneś być w stanie wywołać żądanie.QueryString.Remove ("sid");

 0
Author: James Curran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-23 14:30:42