2010-01-29 21 views
8

(Esta es una pregunta más limitada)¿Por qué Request.QueryString ["ReturnUrl"] devuelve NULL, incluso si está presente en la URL?

En mi acción asp.net MVC, estoy buscando si el valor ReturnUrl está en la URL.

mi URL tiene el siguiente aspecto:

http://localhost:56112/user/login?ReturnUrl=/user/settings 

En mi acción, estoy buscando si existe ese valor cadena de consulta, y se devuelva NULL ?? ¿Cómo puede ser esto?

El código:

if(Request.QueryString["ReturnUrl"] != null) 
{ 

} 

rastreo a través de la aplicación, se acaba sin esperar si el cuerpo de la declaración es decir, es NULL.

¿Cómo se puede explicar esto?

actualización

En el controlador que verifica si el usuario ha iniciado la sesión, tengo una ActionFilter que se parece a:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 
     // some stuff 
     string loginUrl = FormsAuthentication.LoginUrl + "/user/settings; 

     context.Response.Redirect(loginUrl); 
    } 
+0

que acaba de ejecutar una prueba rápida, y funcionó bien para mí.¿Estás usando algún controlador http personalizado o similar? –

+0

Eche un vistazo a esto también: http://stackoverflow.com/questions/1783059/query-string-with-slashes-not-working-in-asp-net-mvc –

+0

@jacerhea Tengo un filtro personalizado que lo hace el redireccionamiento a la página de inicio de sesión. ver mi actualización arriba – Blankman

Respuesta

3

Trate depurar el código - que debería ser capaz de ver en el depurador toda la lista de parámetros de QueryString, para que pueda ver si lo deletrea mal.

+0

Mi colección de querystring está vacía, pero puedo ver la? ReturnUrl =/user/settings en la URL. – Blankman

+1

¿Puede obtener la cadena Request.RawUrl y verificar que la solicitud tenga la URL completa con la cadena de consulta? –

+0

Request.RawUrl no tiene la cadena de consulta. Muy extraño, ¿la URL en el navegador sí? – Blankman

1

Acabo de toparme con un problema similar.

Request.RawUrl es correcto, la url enviada al navegador no incluye QueryString. Verifique el origen de vista de la página y verifique la url en el atributo de acción de su elemento de formulario. Es probable que descubras que falta QueryString.

Lo que probablemente está sucediendo es que está utilizando una sobrecarga de @ Html.BeginForm que toma el parámetro routeValues. Usar cualquier sobrecarga con "routeValues" generará una nueva URL de enrutamiento y eliminará cualquier parámetro de cadena de consulta. En mi caso, quería agregar el atributo enctype y la única sobrecarga requiere que se especifique routeValues. Supongo que es un descuido en MVC 3.

Sin embargo, aún puede escribir su propia etiqueta de forma a la antigua. Al mirar el código fuente de MVC 3, parece que la sobrecarga base para Html.BeginForm usa Request.RawUrl.

Pruebe lo siguiente:

<form action="@Request.RawUrl" method="post" enctype="multipart/form-data"> 
0

que tenía un problema similar al novato desarrollador Asp.Net MVC. El problema era un formulario de inicio de sesión que estaba publicando el formulario en su controlador específico. Por lo tanto, los valores de cadena de consulta faltantes son muy normales. Porque el atributo de acción de formulario es como action = "/ index/login"

La solución que apliqué es agregar un campo oculto a mi formulario con valor de la cadena de consulta. Esto debe agregarse como parámetro al ActionResult o al modelo.

@Html.Hidden("returnUrl", Request.QueryString["returnUrl"]) 

Otra solución es pasar a la forma de acción URL como:

@using (Html.BeginForm("login", "contr", new {returnUrl = Request.QueryString["returnUrl"]}) 
Cuestiones relacionadas