2009-01-30 6 views
9

Nehmen wir an, ich habe eine Controlleraktion, die ein Element aus dem Einkaufskorb eines Benutzers löscht. Diese Controller-Aktion wird ausgelöst, indem ein POST für die URL ~/delete/{id} ausgeführt wird. Wenn ich mehrere Seiten in meiner Anwendung habe, die auf diese URL posten, wie konstruiere ich die Controller-Aktion, um zurück zu der Seite zu gelangen, die dorthin gepostet wurde?Wie leiten Sie die aufrufende Seite in ASP.NET MVC um?

Antwort

0

Ich habe es noch nie ausprobiert, aber Sie können den Referer-Header verwenden, um zu wissen, woher der Post oder get kommt, und versuchen, die URL mit einer Route abzugleichen.

11

Sie sollten auf der Buchungsseite einen RedirectToUrl-Parameter angeben.

Es ist keine gute Praxis, sich auf Referrer-Header zu verlassen.

Stattdessen etwas tun, wie folgt aus:

public ActionResult Delete(int id, string RedirectToUrl) 
{ 
    // check if RedirectToUrl is null or empty and redirect accordingly 
} 

Auf der Buchungsansicht oder Teilansicht der Parameter auf verschiedene Weise zur Verfügung stellen kann:

<%= Html.Hidden("RedirecToUrl","/my/lovely/url") %> 

oder

<form action="/item/delete/22?RedirectToUrl=/my/lovely/url"> 

I würde die erste Option bevorzugen.

+0

Die meisten Statistik-Systeme stützen sich auf den Referer-Header zu wissen, wo die Anfrage kommt. Es ist nicht zuverlässig, aber wenn ich wählen muss, jeden Link in einer Website zu ändern und im Referer-Header auf Redirect zu setzen, wähle ich den letzten oder mache einen Ajax-Actionlink, wie tvafosson es vorschlägt. –

+0

Ja, es ist immer ein Kompromiss. Das Ändern jedes Links in einer Website klingt für mich allerdings nach schlechtem Design. Wenn Sie Ihre Controller testen, ist der Redirect-Parameter auch einfacher zu testen. –

+2

Dies ist es, was wir tun, aber ich rate dringend, die übergebene Weiterleitungs-URL zu "desinfizieren" und sie zu ignorieren, wenn sie nicht Teil Ihrer Website ist. Dies gilt auch für Referrer-Header. –

2

Die erste Sache, die ich tun würde, ist Ajax.ActionLink, dann, wenn der Benutzer Javascript aktiviert hat, würden Sie nie wirklich die Seite verlassen. Dies ist die beste Lösung. Wenn Sie keine Verknüpfung möchten, können Sie auch eine Ajax-Form haben. Beide könnten die DELETE- oder POST-Methode verwenden.

Um den Fall zu behandeln, in dem Javascript deaktiviert ist, wenn Sie im Controller erkennen, dass der POST nicht mit Ajax durchgeführt wurde (Request.IsAjaxRequest ist false), können Sie die Request.UrlReferrer-Eigenschaft abrufen Url der verweisenden Seite. Wenn dies nicht null ist, können Sie ein RedirectResult verwenden, um zu dieser Seite zurückzukehren. Wenn es null ist, wählen Sie eine Standardzielseite - wahrscheinlich so etwas wie "Ihr Artikel wurde entfernt, klicken Sie hier, um mit dem Einkauf fortzufahren." Letzteres wird wahrscheinlich nur selten getroffen.

0

Verwenden Sie einfach den Header URL Referer [sic].

var requestFrom = Request.UrlReferrer 

Sie in der Dokumentation finden: Das ist würde http://msdn.microsoft.com/en-us/library/system.web.httprequest.urlreferrer.aspx

die einzige Zeit nicht arbeiten, wenn die Seite direkt angefordert wird, aber in diesem Fall würden Sie nicht an jedem Ort zu sowieso umleiten .

Es gibt auch die Möglichkeit, mit AJAX nur async zu machen, so dass Ihre Delete-Aktion nur das tut, was sie beschreibt, und nicht verantwortlich ist, etwas außerhalb ihres beabsichtigten Löschzwecks zu tun.

0

Wenn Sie WCSF (Web Client Software Factory) zum Implementieren von MVC-Mustern verwenden, können Sie mit PageFlow die gesamte Navigation ausführen.

ZB: -

PageFlow.Next(); oder PageFlow.Bisherige();

10

Das ist, was ich tue:

public ActionResult ResendActivationEmail() 
    { 
     // Do other things here 
     return new RedirectResult(Request.UrlReferrer.AbsoluteUri); 
    } 
Verwandte Themen