2008-10-23 11 views
20

Usando el siguiente código consigo una buena cadena con formato:outputing una cadena de consulta manipulados en C#

Request.QueryString.ToString 

me da algo así como: & hola = mundo & Microsoft = chupa

Pero cuando se utiliza este código para clonar la colección a otro objeto (del mismo tipo) obtengo el Tipo() en su lugar desde el método 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()); 

¿Hay alguna manera más ordenada de imprimirlo en lugar de buscar y construir la cadena manualmente?

+10

Si microsoft chupa como usted escribió en el ejemplo, ¿por qué usa la tecnología de Microsoft? –

+10

Estaba bromeando frialdad –

Respuesta

7

También puede usar Reflector para extraer la clase HttpValueCollection en la suya y luego usarla.

+0

Te estoy dando la victoria aquí hmemcpy as es probablemente el más apropiado, pero no resuelve mi problema, supongo que tendré que hacerlo de manera sucia –

+0

En realidad, prácticamente solo necesitas el método HttpValueCollection.ToString (bool urlencoded, IDictionary excludeKeys). –

+0

Sí, al igual que James dijo, HttpValueCollection anula ToString() para crear la cadena de consulta con HttpEncoded values ​​y ampersands. Puede usar Agregar/Eliminar en los valores, y luego llamar a ToString() para crear su nueva cadena de consulta. –

1

¿Por qué quiere copiar la colección QueryString en una nueva NameValueCollection?

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

Sí, de hecho, estoy equivocado, es de solo lectura. Así que la esencia es utilizar el método Remove en su NameValueCollection:

System.Collections.Specialized.NameValueCollection variables = new System.Collections.Specialized.NameValueCollection(Request.QueryString); 
if (!string.IsNullOrEmpty(variables["sid"])) 
    variables.Remove("sid"); 
+0

Porque no puedo eliminar de la colección Querystring, ya que es de solo lectura –

+0

corrigió mi respuesta ;-) –

0

Request.QueryString vuelven en realidad un objeto HttpValueCollection (que Unfortuately, es interno a System.Web por lo que puede no él).

Sin embargo, HttpValueCollection se deriva de NameValueCollection, y su método Remove() permanece intacto, por lo que debería poder llamar a Request.QueryString.Remove ("sid");

+0

Lamentablemente no se puede hacer eso, ya que es una colección readonly –

4

Porque en realidad es un NVC especial que es de tipo HTTPValueCollection. Entonces, cuando llama a .ToString en él, sabe cómo formatearlo correctamente.

1

Si no absolutamente necesario un NameValueCollection, un diccionario ofrece una gran cantidad de la misma semántica:

var variables = Request.QueryString.OfType<DictionaryEntry>() 
    .Where(entry => entry.Key != "sid") 
    .ToDictionary(entry => entry.Key, entry => entry.Value); 
+1

Creo que esto no funcionará en las cadenas de consulta con llaves duplicadas. –

65

HttpValueCollection es interno, pero se puede utilizar "var" para declarar sin extraerlo con reflector .

var query = HttpUtility.ParseQueryString(Request.Url.Query); 
query["Lang"] = myLanguage; // Add or replace param 
string myNewUrl = Request.Url.AbsolutePath + "?" + query; 
+1

esto es increíble. –

+0

Buen consejo, gracias :) –

+2

¡Buena idea! Pero 'var' no está haciendo nada por ti aquí, eso es solo el envío de métodos virtuales. 'NameValueCollection values ​​= HttpUtility.ParseQueryString (...)' funcionará igual de bien. También agregaría un comentario para explicar lo que estás haciendo. –

Cuestiones relacionadas