Obtenga la cadena de consulta completa en C # ASP.NET

79

Como programador de PHP, estoy acostumbrado a usar $ _GET para recuperar la cadena de consulta HTTP ... y si necesito la cadena completa, hay muchas formas de hacerlo.

Sin embargo, en ASP, parece que no puedo obtener la consulta.

Aquí está el código para news.aspx (incrustado en algunos HTML):

<%                             
    string URL = "http://www.example.com/rendernews.php?"+Request.Querystring;
    System.Net.WebClient wc = new System.Net.WebClient();
    string data = wc.DownloadString(URL);
    Response.Output.Write(data);
%>

Estoy obteniendo la salida de un script PHP de un servidor remoto, y esto funciona perfectamente sin Request.Querystring.

El problema es que estoy tratando de obtener la cadena de consulta completa en la primera línea: Request.Querystring. Recibo un error " La referencia de objeto no está configurada como una instancia de un objeto ", lo que básicamente significa que Request.Querystring no existe.

¿Alguna idea de cuál es el problema aquí? ¿Cómo puedo obtener esa cadena de consulta cuando se llama index.aspx como http://test.com/news.aspx?id=2 mi script recupera http://www.example.com/rendernews.php?id=2

Antony Carthy
fuente
¿Siempre falla o hay casos extremos como no obtener variables definidas?
Matt

Respuestas:

16

Esto debería funcionar bien para ti.

Escribe este código en el Page_Loadcaso de la página.

string ID = Request.QueryString["id"].ToString();
Response.Redirect("http://www.example.com/rendernews.php?id=" + ID);
Trasero naveed
fuente
8

Request.QueryStringle devuelve una colección de pares clave / valor que representan la cadena de consulta. No es una cuerda. Sin embargo, no crea que eso causaría un error de referencia de objeto. La razón por la que lo entiendes es porque, como señaló Mauro en los comentarios. Es QueryString y no Querystring.

Tratar:

Request.QueryString.ToString();

o

<%                                 
    string URL = Request.Url.AbsoluteUri 
    System.Net.WebClient wc = new System.Net.WebClient();
    string data = wc.DownloadString(URL);
    Response.Output.Write(data);
%>

Igual que su código, pero Request.Url.AbsoluteUridevolverá la ruta completa, incluida la cadena de consulta.

Damien
fuente
Con eso obtengo: "'System.Web.HttpRequest' no contiene una definición para 'Querystring' y ningún método de extensión 'Querystring' aceptando un primer argumento de tipo 'System.Web.HttpRequest'" y cuando intento agregar System. Web antes, obtengo "El tipo o nombre del espacio de nombres 'Solicitud' no existe en el espacio de nombres 'System.Web' (¿le falta un ensamblado?)"
Antony Carthy
Es posible que desee asegurarse de no anular Solicitud en algún lugar. Tengo algo que usa Request.Querystring [.ToString ()] en producción y funciona perfectamente.
Matt
2
¿No es QueryString y no Querystring? el código anterior se parece a c # - recuerde la distinción entre mayúsculas y minúsculas
Mauro
1
En mi caso, esto es exactamente lo que quiero evitar, porque ToString () tiene errores en la **** versión anterior del marco .NET que me veo obligado a usar.
Florian Winter
1

Solo use Request.QueryString.ToString()para obtener una cadena de consulta completa, como esta:

string URL = "http://www.example.com/rendernews.php?"+Request.Querystring.ToString();
terR0Q
fuente
1
Esto devuelve el nombre de la clase.
Allov
1
@Allov Lo he probado, y devolvió la cadena de consulta correctamente, y de hecho, incluso sin .ToString () funcionará cuando se concatene con una cadena
yoel halb
No funcionó en .Net 4. Posiblemente los votos a favor sean para otras versiones de .Net.
Fabio Milheiro
1
En realidad, está cambiando & para & amp; por lo que lo vuelve inutilizable. Request.Url.Query es mucho mejor.
Jiří Herník
0

He probado su ejemplo, y aunque Request.QueryString no es convertible a una cadena ni implícita ni explícita, el método .ToString () devuelve el resultado correcto.

Además, cuando se concatena con una cadena usando el operador "+" como en su ejemplo, también devolverá el resultado correcto (porque esto se comporta como si se hubiera llamado a .ToString ()).

Como tal, no hay nada malo con su código, y sugeriría que su problema se debió a un error tipográfico en su código al escribir "Querystring" en lugar de "QueryString".

Y esto tiene más sentido con su mensaje de error, ya que si el problema es que QueryString es una colección y no una cadena, tendría que dar otro mensaje de error.

yoel halb
fuente
-1

hace un momento, me encontré con el mismo problema. y lo resuelvo de la siguiente manera.

Response.Redirect("../index.aspx?Name="+this.textName.Text+"&LastName="+this.textlName.Text);

con referencia a este

usuario2147280
fuente
1
Nunca, nunca, nunca cree URL como esta en ningún marco o lenguaje de programación. Utilice creadores de URL. Ellos se encargan de la codificación por usted, lo que no hace el código anterior.
Florian Winter