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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top