2008-11-24 15 views
7

Ich möchte von einer Aktion in einem Controller auf eine Aktion in einem zweiten Controller umleiten. Normalerweise würde ich RedirectToAction ("actionName", "controllerName", Objekte) verwenden; Die Methode, die ich umleiten möchte hat zwei Überlastungen:Umleiten zu Aktion in anderen Controller

  • One für HttpVerbs.Get, die für die direkte
  • Verknüpfung verwendet wird
  • One für HttpVerbs.Post Referenztypen zu akzeptieren, die durch modelbinding
gefüllt werden

Wenn ich meine Redirect mit der RedirectToAction-Methode mache, werde ich standardmäßig auf die GET-Methode umgeleitet, die natürlich nicht mit meinen Parametern übereinstimmt.
Wie kann ich sicherstellen, dass es zur Überlastung der richtigen Aktion umgeleitet wird?

--EDIT--
Auf Anfrage einige weitere spezifische Details:
Die Aktion, die ich umleiten möchten die Bildschirmtextsystem auf der Basis der Parameter auf füllt und dann die richtige Ansicht aufruft.

public ActionResult OverView(SearchBag searchBag, IngredientBag ingredientBag) { 

Es hat eine zweite Version für erhält, damit es von GET arbeiten:

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult OverView(int colorId, string paintCode, string name, int formulaId) { 
    return OverView(new SearchBag() 
     { ColorId = colorId, PaintCode = paintCode, ColorName = name, FormulaId = formulaId } 
      , formulaViewData.IngredientBag); 
} 

Der, den ich jetzt ruft mich in einem anderen Controller ist. Es führt einige Vorberechnungen durch, holt die benötigten Informationen und führt genau das Gleiche wie die vorherigen Aktionen aus. Ich könnte den Code von der ersten Aktion replizieren, aber ich würde diese Aktion lieber nur aufrufen.

[AcceptVerbs(HttpVerbs.Post)] 
public RedirectToRouteResult ReCalculate(SearchBag searchBag, IngredientBag ingredientBag) { 

Ich könnte eine temporäre lokale Instanz der nächsten Controller erstellen, aber ich bemerkte, dass es nicht die richtige Httpcontext hat und trifft nicht Initialisierungsmethoden.

+0

Sie können mehrere Verben auf eine einzelne Aktion wie diese setzen [AcceptVerbs (HttpVerbs.Post | HttpVerbs.Get)] –

+0

Also versuchen Sie RedirectToAction von der Aktion ReCalculate zu der Aktion OverView? –

+0

ja. Und da ich alle meine Objekte geholt und in ReCalculate neu berechnet habe, möchte ich das nicht noch einmal in meiner Übersichtsaktion tun müssen. –

Antwort

3

Sie können RedirectToAction (oder etwas anderes) nicht verwenden, um den Browser mit einem HTTP-POST umzuleiten. Sie können es vielleicht mit etwas JavaScript hacken, aber es wäre hässlich.

Wenn Sie weitere Details zu der Zielaktion angeben können, zu der Sie den Benutzer umleiten möchten, können wir bessere Antworten für Sie bereitstellen. Bitte aktualisieren Sie Ihre Frage mit der Signatur der Zielaktion und Details darüber, was Sie als Parameterwerte angeben möchten, damit die Benutzer eine anständige Anleitung geben können.

Ich vermute, was Sie tun möchten, ist, einige Daten in TempData zu speichern, RedirectToAction aufzurufen, laden von TempData in der Ziel-Controller/Aktion und zu verarbeiten.

Weitere Informationen zu TempData finden Sie unter diesen Fragen. http://www.google.com/search?q=tempdata+site%3Astackoverflow.com

+0

Die Aktion, die ich umleiten möchte, füllt meine viewData mit dem erforderlichen contenet (Listbox-Elemente und so) und ruft dann die Ansicht auf. Die zweite Aktion (die ich jetzt anrufe) führt zuerst einige spezifische Berechnungen durch und macht genau die gleichen Dinge wie die erste. Ich werde mein OP aktualisieren –

2

Da Sie Ihr Objekt ausgefüllt haben, können Sie dieselbe Ansicht von der ersten Aktion zurückgeben, anstatt umzuleiten.

Verwandte Themen