2010-02-15 21 views
5

Este es un duplicado de How to RedirectToAction in ASP.NET MVC without losing request dataPasar información entre controladores en ASP.Net MVC-


Hola, he entrado en un problema que me está haciendo rasco la cabeza un poco. Básicamente tengo una página de inicio de sesión, Login.aspx, que tiene campos de nombre de usuario y contraseña, así como también una pequeña casilla importante. El inicio de sesión se maneja en el método de inicio de sesión AccountController. El código actualmente es el siguiente:

[AcceptVerbs(HttpVerbs.Post)] 
[SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", 
    Justification = 
     "Needs to take same parameter type as Controller.Redirect()")] 
public ActionResult LogOn(string userName, string password, string returnUrl, 
    bool sendStoredInfo) 
{ 
    if (!this.ValidateLogOn(userName, password)) { 
     return View(); 
    } 

    this.FormsAuth.SignIn(userName, false); 

    if (!String.IsNullOrEmpty(returnUrl)) { 
     return Redirect(returnUrl); 
    } else { 
     return RedirectToAction("Index", "Home"); 
    } 
} 

Básicamente, si la línea devuelve Redirigir (returnUrl); dispara, luego terminará en otro controlador, el OpenIDController, y es esa situación donde el bool sendStoredInfo se vuelve importante. Pero el problema es que no tengo referencia cuando estoy en OpenIDController. ¿Cómo puedo enviar este valor?

Respuesta

11

Cambiar la llamada a:

return RedirectToAction("LoginFailed", new { sendFlag = sendStoredInfo }); 

El método de la acción de la firma controlador podría ser algo como:

public ActionResult LoginFailed(bool sendFlag) 
{ 
    ... 
} 
1

Debido a la naturaleza de las redirecciones, solo puede realizar una operación GET.

Esto significa que debe pasar el parámetro como parte de la cadena de consulta.

por lo que sería redirigir a una URL como http://host/dir/page?sendStoredInfo=true

A continuación, puede optar por tener parte de su firma del método en el otro controlador, o bien, se puede elegir para acceder a ella directamente a través de la HttpRequest expuesta por el HttpContext para la operación.

También puede llamar a la RedirectToAction, según esta pregunta anterior:

How to RedirectToAction in ASP.NET MVC without losing request data

13

Considere también el uso de TempD ata para pasar datos del controlador al controlador. Esto puede ser una ventaja ya que no tendrá que exponer la interfaz bool sendFlag potencialmente al usuario.

Código en el primer controlador:

TempData["sendFlag"] = sendStoredInfo; 
return RedirectToAction("LoginFailed"); 

Código en el segundo controlador:

public ActionResult LoginFailed() 
{ 
    bool sendFlag = TempData.ContainsKey("sendFlag")? TempData["sendFlag"]: false; 
} 
+0

Gracias Jace Rhea, hice los cambios sugeridos. –

+0

por qué este bool sendFlag = TempData.ContainsKey ("sendFlag")? TempData ["sendFlag"]: falso; lanzará una excepción que diga "referencia de objeto nulo"? – Umitk

+1

TempData es nulo? –

1

En lo que a mi conocimiento no me falla, existen cuatro métodos diferentes para manejar pasar datos entre los controladores de asp.net MVC. Son 1. ViewData 2. ViewBag 3. TempData y 4. Sesiones. Si desea una explicación relativamente buena además de una muestra descargable, consulte here

Cuestiones relacionadas