2010-02-15 7 views
5

Ceci est un double de How to RedirectToAction in ASP.NET MVC without losing request datainformations entre les contrôleurs dans ASP.Net MVC-


Salut, je suis venu dans un problème qui me fait me gratter la tête un peu. Fondamentalement, j'ai une page de connexion Login.aspx, qui a des champs de nom d'utilisateur et mot de passe, ainsi qu'une petite case importante. La connexion est gérée dans la méthode de connexion de AccountController. Le code est actuellement comme suit:

[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"); 
    } 
} 

Fondamentalement, si la ligne de retour de redirection (returnUrl); se déclenche dans un autre contrôleur, le OpenIDController, et c'est dans cette situation que le booléen sendStoredInfo devient important. Mais le problème est que je n'ai aucune référence quand je suis dans le OpenIDController. Comment puis-je envoyer cette valeur à travers?

Répondre

11

Modifier l'appel à:

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

pourrait être quelque chose comme la signature de la méthode d'action du contrôleur:

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

En raison de la nature des redirections, vous pouvez uniquement effectuer une opération GET. Cela signifie que vous devez transmettre le paramètre dans le cadre de la chaîne de requête.

Donc, vous rediriger vers une URL comme http://host/dir/page?sendStoredInfo=true

Ensuite, vous pouvez choisir de faire partie de votre signature de la méthode dans l'autre contrôleur, ou, vous pouvez choisir d'accéder directement à l'aide de la HttpRequest exposée par la HttpContext pour l'opération.

Vous pouvez également appeler le RedirectToAction, selon cette question précédente:

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

13

Également envisager d'utiliser TempD ata pour transmettre les données du contrôleur au contrôleur. Cela peut être avantageux car vous n'aurez pas à exposer l'interface bool sendFlag potentiellement à l'utilisateur.

code dans le premier contrôleur:

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

code dans le second contrôleur:

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

Merci Jace Rhea, j'ai fait les changements suggérés. –

+0

pourquoi ce bool sendFlag = TempData.ContainsKey ("sendFlag")? TempData ["sendFlag"]: false; lancera une exception disant "objet référence null"? – Umitk

+1

TempData est null? –

1

En ce qui concerne ma connaissance me sert bien, quatre méthodes différentes existent pour gérer le passage des données entre les contrôleurs en asp.net MVC. Ils sont 1. ViewData 2. ViewBag 3. TempData et 4. Sessions. Si vous souhaitez une explication relativement bonne en plus d'un échantillon téléchargeable, veuillez jeter un oeil à here

Questions connexes