2013-12-27 18 views
5

In den meisten Aktionen in meinem Controller muss ich überprüfen, ob eine Bedingung erfüllt wurde, und wenn nicht den Benutzer auf eine andere Aktion in der gleichen Controller umleiten, so habe ich versucht:Umleiten zu Aktion von innerhalb einer Methode

public ActionResult Transactions() 
    { 
     GrossGalsConfermation(); 
     return View(); 
    } 

    public void GrossGalsConfermation() 
    { 
     if (Session["HasConfirmed"] == null && TerminalUserData.IsGrossGallonTerminal) 
     { 
      RedirectToAction("ConversionFactors"); 
     } 
    } 

aber selbst wenn die if Aussage wahr ist, wird die RedirectToAction nicht ausgeführt. Ich habe einen Debug in VS gemacht und kann es von der Action auf die Method springen, bewerten die IF Anweisung und gehen Sie in es um die RedirectToAction laufen, aber dann springt es direkt zurück auf die aufrufende Acation und Rückkehr ist es Sicht. Wie kann ich die Umleitung erzwingen? Suche in der Zeile finde ich ähnliche Probleme und die Lösung war, von void zu ActionResult zu ändern, aber dann muss ich einen Fallback Action zurückgeben, was nicht getan werden kann, da diese Method wird von Dutzenden von Ansichten aufgerufen werden.

+0

Was passiert, wenn Sie die 'if' nehmen passiert? Leitet es die Aktion um? – IanAuld

+0

@IanAuld Es wird nicht - Sie müssen * das RedirectToRouteResult zurückgeben, wenn der Browser umgeleitet werden soll. –

+0

Es sieht aus wie Sie Helper-Methode anstelle von Action-Filter verwenden ... –

Antwort

5

Alle RedirectToAction ist eine RedirectToRouteResult zurückgeben - der Browser wird nicht umgeleitet, es sei denn Sie tatsächlich zurückgeben. Da Sie dies nicht innerhalb Ihrer Methode tun möchten (Sie könnte Null zurückgeben und Null-Prüfungen in Ihrer Aktion tun, aber es wäre ungeschickt), würde ich vorschlagen, stattdessen einen Aktionsfilter zu verwenden. So etwas wie die folgenden es tun würde:

public class GrossGalsFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (Session["HasConfirmed"] == null 
            && TerminalUserData.IsGrossGallonTerminal) 
     { 
      filterContext.Result = 
       new RedirectToRouteResult(new RouteValueDictionary(new 
       { controller = "MyController", action = "ConversionFactors" })); 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

Dann schmücken Sie Ihre Controller-Aktionen:

[GrossGalsFilter] 
public ActionResult MyControllerAction 

Beachten Sie, dass Sie den Filter ändern müssen möglicherweise halten TerminalUserData.IsGrossGallonTerminal zu bekommen - unmöglich zu wissen, wo das kommt von basierend auf Ihrer Frage.

Mehr über Maßnahmen Filter: http://msdn.microsoft.com/en-us/library/dd381609(v=vs.100).aspx

+0

Danke, ich hatte nicht über einen Aktionsfilter nachgedacht. Wenn ich am Montag zur Arbeit zurückkehre, werde ich in einen Aktionsfilter umwandeln und sehen, wie das funktioniert. – Matthew

+0

Ich habe heute darüber nachgedacht und habe mich nur gefragt, wie ich herausfinden könnte, welcher Controller ursprünglich hieß.So kann ich sie zurückgeben, nachdem sie die erforderlichen Schritte in der ConversionFactors-Ansicht abgeschlossen haben. Ich weiß, dass es nicht in der ursprünglichen Anfrage war, aber ich habe es gerade heute erkannt (ich kann dies zu einer separaten Frage machen, wenn das passender ist) – Matthew

+0

Der einfachste Weg wäre, eine Rückleitungs-URL als GET-Parameter zur Weiterleitung hinzuzufügen. Sie können einen UrlHelper instanziieren, um die entsprechende URL dynamisch abzurufen. –

1

Sie vermissen eine „Rückkehr“:

return RedirectToAction(...); 

Wenn Sie die Methode mehrfach wiederverwendet werden Sie in das Schreiben eines Filters aussehen sollte.

+0

Lesen Sie die Frage vollständig. * Suche in der Zeile Ich finde ähnliche Probleme und die Lösung war, von void zu ActionResult zu wechseln, aber dann muss ich eine Fallback-Aktion bereitstellen, die nicht durchgeführt werden kann, da diese Methode von Dutzenden von Ansichten aufgerufen wird. * –

+0

Sie brauchen noch ActionResult zurückgeben. –

+0

Ihre Antwort bezieht sich nicht auf die Frage. –

-1

Ihre GrossGalsConfirmation() (es ist mit einem i nicht geschrieben und e btw) gibt nichts zurück. Ändern Sie den Rückgabetyp auf ActionResult und geben Sie RedirectToAction zurück.

+0

Von OP: Suche in der Zeile Ich finde ähnliche Probleme und die Lösung war von void zu ActionResult zu ändern, aber dann muss ich eine Fallback-Aktion bereitstellen, die nicht durchgeführt werden kann, da diese Methode von Dutzenden von Ansichten aufgerufen wird. – Matthew

Verwandte Themen