2016-05-25 12 views
1

Ich habe zwei Controller Base und Login.Nicht möglich, returnurl in asp.net mvc Controller

Basis Controller:

public ActionResult start() 
    { 
     string action = Request.QueryString[WSFederationConstants.Parameters.Action]; 
    } 

Anmeldung Controller:

public ActionResult Login(string user,string password,string returnUrl) 
    { 
     if (FormsAuthentication.Authenticate(user, password)) 
     { 

      if (string.IsNullOrEmpty(returnUrl) && Request.UrlReferrer != null) 
       returnUrl = Server.UrlEncode(Request.UrlReferrer.PathAndQuery); 

      return RedirectToAction("Start","Base", returnUrl }); 
     } 
     return View(); 
    } 

Nach der Authentifizierung es weitergeleitet wird getan wird Aktion in Basissteuerung zu starten, wie erwartet. Aber die Abfragezeichenfolge holt den Wert nicht. Wenn es über den Querystring verschoben wird, zeigt es den Längenwert, aber nicht das URI.

Wie die URL verwendet wird, die vom Login-Controller im Base Controller gesendet wird, und Parameter von diesem abrufen?

+0

Was ist 'WSFederationConstants.Parameters.Action'. Und es muss 'return RedirectToAction (" Start "," Base ", neu {returnUrl = returnUrl});' wenn der Wert dieser Konstante '" returnUrl "' ist (du bekommst 'length = 9' weil es 9 sind Zeichen in "returnUrl") –

+0

wie von @ StephenMuecke vorgeschlagen habe ich und kann die URL in Base Controller. Aber die abgerufene URL hat kein richtiges Format und kommt mit '% 2f% f wsignin ...' anstelle von/(Schrägstrich) und? (Fragezeichen), so dass die Aktionsvariable die Aktion nicht aus der Abfragezeichenfolge abrufen kann. –

+0

Das, weil die Methode es codiert. Aber was ist der Zweck davon? Wenn Sie einen Wert für 'returnUrl' haben, warum werden Sie nicht einfach mit 'return RedirectToLocal (returnUrl) 'dorthin umgeleitet?' - Was ist Ihre 'start()' Methode für? –

Antwort

0

Sie geben tatsächlich einen 302 an den Client zurück. Aus der docs.

Gibt ein HTTP 302 Antwort an den Browser, die den Browser verursacht eine GET-Anfrage an die angegebene Aktion zu machen.

Wenn Sie dies tun, wird der Client eine weitere Anfrage mit der URL erstellen, die Sie erstellt haben. In Ihrem Fall etwas wie youruri.org/Base/Start. Sehen Sie sich den Netzwerk-Tab in Ihrem Browser an (F12 in Chrome).

Was ich denke, was Sie tun wollen, ist:

return RedirectToAction 
    ("Start", "Base", new { WSFederationConstants.Parameters.Action = returnUrl }); 

Unter der Annahme, dass WSFederationConstants.Parameters.Action eine Konstante ist. Wenn WSFederationConstants.Parameters.Action die Zeichenfolge fooUrl Ihre Aktion gibt die folgende an den Browser zurück:

Location:/Base/Start?fooUrl=url 
Status Code:302 Found 

Eine weitere Option ist, um tatsächlich den Wert an die Steuerung übergeben:

public class BaseController: Controller 
{ 
    public ActionResult start(string myAction) 
    { 
     string localAction = myAction; //myAction is automatically populated. 
    } 
} 

Und in Ihrem Redirect:

return RedirectToAction 
    ("Start", "Base", new { myAction = returnUrl }); 

Dann wird die BaseController automatisch den Parameter abrufen, und Sie müssen es nicht aus der Querystring holen .

+0

Ich habe viele Parameter in der URL. Ich muss sie mit Querystring holen und wie von Stephen vorgeschlagen, kann ich die URL in Base Controller bekommen. Aber die abgerufene URL hat kein richtiges Format und kommt mit '% 2f% f wsignin ...' anstelle von/(Schrägstrich) und? (Fragezeichen), so dass die Aktionsvariable die Aktion nicht aus der Abfragezeichenfolge abrufen kann. –