Umleiten auf eine andere Seite in ASP.NET MVC mithilfe von JavaScript / jQuery

72

Ich möchte mit JavaScript / jQuery / Ajax von einer Seite auf eine andere Seite in ASP.NET MVC 3.0 umleiten. Beim Klicken auf die Schaltfläche habe ich JavaScript-Code wie unten geschrieben.

function foo(id)
{
    $.post('/Branch/Details/' + id);
}

Mein Controller-Code lautet wie folgt:

public ViewResult Details(Guid id)
{
     Branch branch = db.Branches.Single(b => b.Id == id);
     return View(branch);
}

Wenn ich auf eine Schaltfläche klicke, wird die Aktion "Details" in BranchController aufgerufen, aber nicht zur Detailansicht zurückgekehrt.

Ich habe keine Fehler oder Ausnahmen erhalten. In Firebug wird der Status 200 OK angezeigt . Was ist in meinem Code falsch und wie kann ich zur Seite mit der Detailansicht umleiten?

Peter Mortensen
quelle

Antworten:

151

Sie abonnieren keinen erfolgreichen Rückruf in Ihrem $ .post AJAX-Anruf. Dies bedeutet, dass die Anforderung ausgeführt wird, Sie jedoch nichts mit den Ergebnissen tun. Wenn Sie mit den Ergebnissen etwas Nützliches anfangen möchten, versuchen Sie:

$.post('/Branch/Details/' + id, function(result) {
    // Do something with the result like for example inject it into
    // some placeholder and update the DOM.
    // This obviously assumes that your controller action returns
    // a partial view otherwise you will break your markup
});

Wenn Sie dagegen umleiten möchten, benötigen Sie AJAX absolut nicht. Sie verwenden AJAX nur, wenn Sie auf derselben Seite bleiben und nur einen Teil davon aktualisieren möchten.

Wenn Sie also nur den Browser umleiten möchten:

function foo(id) {
    window.location.href = '/Branch/Details/' + id;
}

Als Randnotiz: Sie sollten niemals solche URLs fest codieren. Sie sollten immer URL-Helfer verwenden, wenn Sie mit URLs in einer ASP.NET MVC-Anwendung arbeiten. Damit:

function foo(id) {
    var url = '@Url.Action("Details", "Branch", new { id = "__id__" })';
    window.location.href = url.replace('__id__', id);
}
Darin Dimitrov
quelle
1
Vielen Dank, dass Sie @Darin. Ich verwende den URL-Helfer, wie Sie vorgeschlagen haben, aber sein Fehler auf der Seite, weil die URL so etwas wie dieser localhost ist /… Wie man die richtige URL von diesem Helfer erhält.
9
@ Sharad, ist dies in einer separaten Javascript-Datei? Wenn dies der Fall ist, können Sie keine URL-Helfer verwenden. Sie können urlin Ihrer Ansicht als globale Variable definieren : <script type="text/javascript">var url = '@Url.Action("Details", "Branch", new { id = "__id__" })';</script>. Und dann können Sie es in Ihrer separaten Javascript-Datei verwenden.
Darin Dimitrov
1
Ja, dies ist in einer separaten JS-Datei. Ich habe es auf der Masterseite platziert und jetzt funktioniert es. Vielen Dank @Darin.
4
Macht ein windows.location.href kein GET? In diesem Fall versucht die ursprüngliche Frage, einen POST durchzuführen. Ich bin überrascht, dass dies als beantwortet markiert wurde, da es einen großen Unterschied zwischen den beiden gibt.
Segeln Judo
Wie verwende ich den letzten Ansatz bei mehreren Parametern?
Sribin
41

Dies kann erreicht werden, indem eine versteckte Variable in der Ansicht verwendet und diese Variable dann zum Posten aus dem JavaScript-Code verwendet wird.

Hier ist mein Code in der Ansicht

@Html.Hidden("RedirectTo", Url.Action("ActionName", "ControllerName"));

Jetzt können Sie dies in der JavaScript-Datei wie folgt verwenden:

 var url = $("#RedirectTo").val();
 location.href = url;

Es wirkte wie ein Zauber für mich. Ich hoffe es hilft dir auch.

Mridul
quelle
Für meine Situation ist diese Antwort überlegen, da ich den Primärschlüssel aus dem Modell (dh Model.WorkFlowID) abrufen wollte, um ihn in die Umleitung aufzunehmen. So: @ Html.Hidden ("RedirectTo", Url.Action ("ActionName", "ControllerName", Model.WorkFlowID));
Glenn Garson
1
eher: @ Html.Hidden ("RedirectTo", Url.Action ("Edit", "WorkFlows", new {id = Model.WorkFlowID}));
Glenn Garson
Das hat mir sehr geholfen! Vielen Dank!!! Ich habe versucht, eine modale Ansicht zu verwenden, um Seiten in MVC umzuleiten, und hatte Probleme. Bin dankbar.
Domshyra
Dies funktioniert bei mir (ASP.NET MVC). window.location.href nicht
ronIT
9

Sie können verwenden:

window.location.href = '/Branch/Details/' + id;

Ihr Ajax-Code ist jedoch unvollständig, ohne Erfolg oder Fehlerfunktionen.

Lauf
quelle
4
// in the HTML code I used some razor
@Html.Hidden("RedirectTo", Url.Action("Action", "Controller"));

// now down in the script I do this
<script type="text/javascript">

var url = $("#RedirectTo").val();

$(document).ready(function () {
    $.ajax({
        dataType: 'json',
        type: 'POST',
        url: '/Controller/Action',
        success: function (result) {
            if (result.UserFriendlyErrMsg === 'Some Message') {
                // display a prompt
                alert("Message: " + result.UserFriendlyErrMsg);
                // redirect us to the new page
                location.href = url;
            }
            $('#friendlyMsg').html(result.UserFriendlyErrMsg);
        }
    });
</script>
Mike Brown
quelle
2
<script type="text/javascript">
    function lnkLogout_Confirm()
    {
        var bResponse = confirm('Are you sure you want to exit?');

        if (bResponse === true) {
            ////console.log("lnkLogout_Confirm clciked.");
            var url = '@Url.Action("Login", "Login")';
            window.location.href = url;
        }
        return bResponse;
    }

</script>
Muhammad Mubashir
quelle
-1

Überprüfen Sie den folgenden Code. Dies ist hilfreich für Sie:

<script type="text/javascript">
  window.opener.location.href = '@Url.Action("Action", "EventstController")', window.close();
</script>
Shahwaiz Hasan
quelle