2012-05-03 14 views
9

Estoy haciendo un redireccionamiento de una página a otra y otra redirección de la segunda página a una tercera. Tengo información de la primera página que no se usa en la segunda página, pero debe transferirse a la tercera página. ¿Es posible enviar la URL de la tercera página con sus cadenas de consulta como una cadena de consulta a la segunda página? He aquí un ejemplo:Cómo envío una URL con cadenas de consulta como una cadena de consulta

Response.Redirect("MyURL1?redi=MyURL2?name=me&ID=123"); 

Mi problema es que la URL que se envía como una cadena de consulta tiene dos variables de cadena de consulta, así que ¿cómo sabrá el sistema que lo que hay después de la & es la segunda variable de la segunda dirección URL y no una segunda variable de la primera URL? Gracias.

+0

¿Ha considerado usar variables de sesión para eso? – V4Vendetta

Respuesta

12

Debe codificar la URL que pasa como parámetro en su URL de redireccionamiento. De esta manera:

MyURL = "MyURL1?redi=" + Server.UrlEncode("MyURL2?name=me&ID=123"); 

Esto creará una URL correcta sin el doble '?' y '' & caracteres:

MyURL1?redi=MyURL2%3fname%3dme%26ID%3d123 

Ver MSDN: HttpServerUtility.UrlEncode Method

Para extraer su URL de redirección de esta URL codificada debe utilizar HttpServerUtility.UrlDecode para convertirlo en una URL correcta de nuevo.

+0

La decodificación/codificación de URL no está bien definida. Cada OS/navegador/servidor tiene sus propias idiocracias. La implementación cambió entre .Netv1.1 y .Netv2.0, por lo que recomendaría seguir los consejos de @JulioHM y usar base64 para las URL que deben estar en los parámetros de consulta. http://bytes.com/topic/asp-net/answers/627843-urldecode-differences-net-1-1-2-0-a – Gabe

+1

El 'HttpServerUtility.UrlDecode' que menciona es accesible a través del' HttpContext. Current.Server.UrlDecode' o simplemente 'Server.UrlDecode' en formularios web. También podría usar el estático 'HttpUtility.UrlDecode'. – BornToCode

1

Su cadena de consulta debería tener este aspecto:

MyURL1?redi=MyURL2&name=me&ID=123 

Comprobar: http://en.wikipedia.org/wiki/Query_string

Debe tener uno? signo y todos los parámetros se unieron con &. Si los valores de los parámetros contienen caracteres especiales solo UrlEncode ellos.

+0

Parece tres cadenas de consulta para MyURL1. Quiero que el nombre y el ID sean cadenas de consulta de MyURL2. –

+0

A continuación, acceda a QueryString actual antes de redirigir y pase los parámetros a la próxima QueryString (las que le interesan). – empi

+0

@DovMiller Solo digo cómo debería ser QueryString. Depende de usted cómo obtiene el QueryString que desea pasar a la siguiente dirección, es solo una cadena, por lo que puede usar subcadena, etc. o simplemente acceder a los valores de los parámetros del diccionario QueryString. Tal vez, no entiendo completamente lo que estás tratando de lograr. – empi

1

Me resulta útil codificar los parámetros de cadena de consulta en Base64 antes de enviar. En algunos casos, esto ayuda cuando necesita enviar todo tipo de caracteres especiales. No es bueno para las cadenas de depuración, pero protegerá CUALQUIER COSA que envíe de mezclarse con otros parámetros.

Solo tenga en cuenta que el otro lado que está analizando la cadena de consulta también tendrá que analizar el Base64 para acceder a la entrada original.

0
using System.IO; 
using System.Net; 

static void sendParam() 
{ 

    // Initialise new WebClient object to send request 
    var client = new WebClient(); 

    // Add the QueryString parameters as Name Value Collections 
    // that need to go with the HTTP request, the data being sent 
    client.QueryString.Add("id", "1"); 
    client.QueryString.Add("author", "Amin Malakoti Khah"); 
    client.QueryString.Add("tag", "Programming"); 

    // Prepare the URL to send the request to 
    string url = "http://026sms.ir/getparam.aspx"; 

    // Send the request and read the response 
    var stream = client.OpenRead(url); 
    var reader = new StreamReader(stream); 
    var response = reader.ReadToEnd().Trim(); 

    // Clean up the stream and HTTP connection 
    stream.Close(); 
    reader.Close(); 
} 
Cuestiones relacionadas