webentwicklung-frage-antwort-db.com.de

Umleitung von JavaScript zu Aktion

Ich habe ein MVC4-Projekt, und auf der Clientseite muss ich zu einer bestimmten Aktionsmethode umleiten. Ich habe den folgenden Beitrag gelesen Wie kann ich die JavaScript-Methode zur Aktion umleiten? , und weiter unten gibt es einen Kommentar zur Verwendung von:

window.location.href = "/{controller}/{action}/{params}";

und ich hatte das schon probiert, aber es funktioniert nicht dort, wo mein Projekt in IIS installiert ist.

Mein Projekt wurde veröffentlicht an: http://localhost/SomeName.SomeOtherName/

und ich muss zu: http://localhost/SomeName.SomeOtherName/Home/Logout

Wenn ich die '/ Controller/Action' wie im vorherigen Beitrag empfohlen benutze, komme ich hier: localhost/Home/Logout und das ist nicht korrekt. 

Ich habe versucht, den veröffentlichten Speicherort (wie oben beschrieben) in einer Datei web.config zu speichern und den String zu erstellen (Verketten: Veröffentlichungsort + '/ Home/Logout'), aber das hat auch nicht funktioniert. Unten ist die stmt, die ich dafür verwende. Seltsam ist, dass dies nur die URL der aktuellen Seite mit meiner erstellten URL verkettet. Dies ist nicht nur ungültig, sondern ich bekomme auch einen dieser potenziell gefährlichen request.path ...-Fehler. 

 window.location.href = "\"" + url + "/Home/logout" + "\"";

Dasselbe passiert, wenn ich $ (location.hostname) zum Erstellen meiner Zeichenfolge verwende.

Irgendwelche Gedanken?

4
RichieMN

Verwenden Sie immer URL-Helfer, wenn Sie URLs für eine Controller-Aktion generieren. Wenn sich das umleitende Skript in der Ansicht befindet, können Sie beispielsweise Folgendes tun:

<script type="text/javascript">
    window.location.href = '@Url.Action("LogOut", "Home")';
</script>

Der Url.Action serverseitige Helfer stellt hier sicher, dass die richtige URL generiert wird, unabhängig davon, ob sich Ihre Anwendung in einem virtuellen Verzeichnis befindet oder nicht.

Wenn sich Ihr Javascript im anderen Fall in einer separaten js-Datei befindet (was natürlich die bewährte Methode ist), in der Sie keine serverseitigen Helfer verwenden können, haben Sie einige Möglichkeiten:

  • Verwenden Sie eine globale Javascript-Variable, die in der Ansicht berechnet und von Ihrem Skript verwendet wird:

    <script type="text/javascript">
        var logoutUrl = '@Url.Action("LogOut", "Home")';
    </script>
    

    und dann irgendwo in deinem Skript:

    window.location.href = logoutUrl;
    
  • Verwenden Sie das HTML5-Attribut data * für ein DOM-Element, das irgendwie mit dem logging out eines Benutzers verknüpft wird. Das könnte zum Beispiel ein div oder eine Schaltfläche sein:

    <div id="logout" data-url="@Url.Action("LogOut", "Home")">Log out</div>
    

    und dann in dein Skript:

    $('#logout').click(function() {
        window.location.href = $(this).data('url');
    });
    

    Offensichtlich scheint dies ein dummes und zu stark vereinfachtes Beispiel zu sein, denn in diesem speziellen Fall hätten Sie einfach einen Html.ActionLink verwendet, um einen LogOut-Anker zu generieren, ohne sich jemals über Javascript oder solche Dinge Gedanken zu machen Weltszenario.

Beachten Sie, wie in allen Beispielen ein URL-Helper verwendet wird, um die richtige URL für die Controller-Aktion zu generieren und mögliche virtuelle Verzeichnisse zu berücksichtigen. Das ist die wichtigste Regel: niemals hardcode eine URL in einer ASP.NET-MVC-Anwendung.

28
Darin Dimitrov

Dies mag zwar zufällig erscheinen, dies hatte jedoch die obige Situation zur Folge, da alles in einem dynamischen Popup angezeigt wurde. Es gibt 2 Schaltflächen (Abmelden, Fortfahren) und ein Bild. Ich hatte Probleme, das Bild richtig anzuzeigen, und wollte einen dynamischen Link mit Hilfe von Helfern. Ich habe das Problem mit folgendem Code gelöst:

  var siteRoot = "@(Request.Url.Scheme)://@(Request.Url.Host)@(Url.Content("~"))"; 

Jemand sieht irgendetwas daran falsch? Alle anderen Beispiele für URL-Hilfsprogramme enthielten immer den Controller und die Methode. Ich brauchte einen gültigen vollständigen Root-Wert. Gedanken?

0
RichieMN