2010-02-15 25 views
5

Questo è un duplicato di How to RedirectToAction in ASP.NET MVC without losing request dataPassing informazioni tra controller in ASP.Net MVC-


Salve, sono venuto in un problema che mi sta facendo gratto la testa un po '. Fondamentalmente ho una pagina di accesso Login.aspx, che ha campi username e password, oltre a una piccola e importante casella di controllo. L'accesso viene gestito nel metodo di accesso a AccountController. Il codice attualmente è il seguente:

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

In sostanza, se la riga restituisce Redirect (returnUrl); spara, quindi finirà in un altro controller, OpenIDController, ed è quella situazione in cui il bool sendStoredInfo diventa importante. Ma il problema è che non ho alcun riferimento ad esso quando sono in OpenIDController. Come posso inviare questo valore?

risposta

11

Modificare la chiamata a:

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

Il metodo di azione firma del controller potrebbe essere qualcosa di simile:

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

A causa della natura dei reindirizzamenti, è possibile eseguire solo un'operazione GET.

Ciò significa che è necessario passare il parametro come parte della stringa di query.

così si sarebbe reindirizzare a un URL come http://host/dir/page?sendStoredInfo=true

Quindi, è possibile scegliere di avere parte della vostra firma del metodo in un altro controllore, oppure, è possibile scegliere di accedere direttamente utilizzando il HttpRequest esposta dal HttpContext per l'operazione.

È possibile anche chiamare il RedirectToAction, di cui al presente domanda precedente:

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

13

Considerare inoltre l'utilizzo di TempD ata per passare i dati dal controller al controller. Questo può essere vantaggioso in quanto non è necessario esporre l'interfaccia bool sendFlag potenzialmente all'utente.

codice nel primo controller:

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

codice nel secondo controller:

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

Grazie a Jace Rhea, ho apportato le modifiche suggerite. –

+0

perché bool sendFlag = TempData.ContainsKey ("sendFlag")? TempData ["sendFlag"]: false; genererà un'eccezione dicendo "riferimento null dell'oggetto"? – Umitk

+1

TempData è nullo? –

1

quanto riguarda la mia conoscenza mi serve bene, quattro diversi metodi esistenti per gestire il passaggio di dati tra controllori in asp.net MVC. Sono 1. ViewData 2. ViewBag 3. TempData e 4. Sessions. Se ti piace una spiegazione relativamente buona oltre a un campione scaricabile, ti preghiamo di dare un'occhiata a here

Problemi correlati