Geração de uma QueryString manipulado em C #
-
04-07-2019 - |
Pergunta
Usando o seguinte código eu recebo uma seqüência agradável formatado:
Request.QueryString.ToString
Dá-me algo como: & Olá = mundo & Microsoft = suga
Mas quando eu usar esse código para clonar a coleção para outro objeto (do mesmo tipo) recebo a volta Tipo () do método ToString () em vez disso.
System.Collections.Specialized.NameValueCollection variables = new System.Collections.Specialized.NameValueCollection(Request.QueryString);
if (!string.IsNullOrEmpty(variables["sid"]))
variables.Remove("sid");
Response.Write(variables.ToString());
Existe uma maneira mais arrumado para a saída, em vez de olhar e construir a corda manualmente?
Solução
Você também pode usar refletor para extrair a classe HttpValueCollection
em seu próprio país, e usá-lo em seguida.
Outras dicas
HttpValueCollection é interna, mas você pode usar "var" declará-la sem extraí-lo com refletor.
var query = HttpUtility.ParseQueryString(Request.Url.Query);
query["Lang"] = myLanguage; // Add or replace param
string myNewUrl = Request.Url.AbsolutePath + "?" + query;
Porque é na verdade um NVC especial que é do tipo HttpValueCollection. Então, quando você chama .ToString sobre ele, ele sabe como formatar corretamente.
Por que você quer copiar a coleção QueryString para um novo NameValueCollection?
if (!string.IsNullOrEmpty(Request.QueryString["sid"]))
Request.QueryString.Remove("sid");
Sim, de fato, eu estou errado, é somente leitura. Assim, a essência é usar o Remove método em seu NameValueCollection:
System.Collections.Specialized.NameValueCollection variables = new System.Collections.Specialized.NameValueCollection(Request.QueryString);
if (!string.IsNullOrEmpty(variables["sid"]))
variables.Remove("sid");
Se você não absolutamente necessário um NameValueCollection, um dicionário oferece uma série da mesma semântica:
var variables = Request.QueryString.OfType<DictionaryEntry>()
.Where(entry => entry.Key != "sid")
.ToDictionary(entry => entry.Key, entry => entry.Value);
Request.QueryString realmente retornar um objeto HttpValueCollection (que unfortuately, é interno ao System.Web para que você não pode ele).
No entanto, HttpValueCollection é derivado de NameValueCollection, e do método Remove () permanece intacta, então você deve ser capaz de chamar Request.QueryString.Remove ( "sid");