2017-08-04 1 views
0

Ich habe einen Link. Bei Verwendung möchte ich eine neue Ansicht laden und dann automatisch eine Aktion aufrufen. Aber ich weiß nur, dass Aufrufe mit einer "return" innerhalb einer ActionResult-Methode geladen werden (damit ich später keine andere Aktion aufrufen kann!).Rückansicht dann Aktion in MVC

Vielleicht denke ich einfach über die ganze Sache falsch, aber ich kann nicht herausfinden, wie man das anders macht.

Eine Sache, die ich versuchte, ist, die Aktion von der Ansicht aufzurufen, aber etwas wie @ Html.ActionLink erfordert den Benutzer zu klicken, während ich möchte, dass die Aktion automatisch ausgelöst wird.

Edit:

Seit ein paar gefragt, hier ist die Motivation für das, was ich versuche zu tun (kostenlos vorzuschlagen bessere Ansätze fühlen!):

ich den Benutzer auf eine Ansicht, während umleiten möchten Ein langer Prozess wird ausgeführt und leitet den Benutzer automatisch zur endgültigen Ansicht um. Die zweite Aktion würde den Prozess aufrufen und den Benutzer umleiten, wenn er abgeschlossen ist.

+0

Was ist der Zweck ist das? Was macht Ihre andere "ActionResult" -Methode? –

+0

Vielleicht gibt es eine bessere Möglichkeit, dies zu tun, aber ich möchte den Benutzer zu einer Ansicht umleiten, während ein langer Prozess ausgeführt wird, und den Benutzer automatisch auf die endgültige Ansicht umleiten. Die zweite Aktion würde den Prozess aufrufen und den Benutzer umleiten, wenn er abgeschlossen ist. – Pablo

+0

Sie könnten den Benutzer auf die erste Ansicht umleiten, und in dieser Ansicht verwenden Sie Ajax, um die zweite Methode aufzurufen, und in seinem Erfolg Rückruf, umleiten, um die endgültige Ansicht –

Antwort

1

Sie müssen den Client bekommen Sie den Browser beim Laden der Seite zu umleiten, es fügen Sie diese am Ende der Ansicht vor dem </html> Tag zu automatisieren:

<script type="text/javascript"> 
    window.location = "@Url.Action("ActionName", "ControllerName")"; 
</script> 

Obwohl ich es bessere Lösungen vermuten, wenn wir wissen, das spezifische Problem, das Sie zu überwinden versuchen.

+0

Ich habe versucht, die Motivation jetzt ein bisschen besser zu erklären. Dies scheint jedoch zu funktionieren (ich muss noch die anderen Antworten überprüfen, um das Problem besser zu verstehen). – Pablo

0

ich gerade bin zu raten, was u versuchen zu tun, kann u so etwas wie dieses

TransactionIndex.cshtml @model List<Transaction> @Html.Partial("../Transaction/_Transaction",model)

Main.chtml <a id="transactionLink" href='@Url.Action("GetMainTransactionView","Transaction")'/>

0

Sie versuchen werden, kann einen asynchronen Ajax-Aufruf vom Client verwenden, um nach dem Rendern der Ansicht eine weitere Anforderung zu stellen.

$(document).ready(function(){ 
jQuery.get(url [, data ] [, success ] [, dataType ]) 
}); 

z.B.

jQuery.get('mywebsite/mycontroller/myaction') 

Andere sind optionale Parameter.

Auf diese Weise können Sie automatisch eine andere Aktion auslösen und die Antwort der Anfrage im Erfolgsrückruf bearbeiten.

$(document).ready(function(){ 
    jQuery.get('mywebsite/mycontroller/myaction', {id:1}, onSuccess); 
}); 
function onSuccess(response){ 
    // add logic to do whatever from response 
} 
+0

Hätte dies einen Vorteil gegenüber der Verwendung von wie in einer anderen Antwort vorgeschlagen? – Pablo

+0

@pablo Ihr Code wird ausgelöst, sobald JS heruntergeladen wurde, und samirs Code wird ausgelöst, nachdem DOM vollständig geladen wurde. – Adrian

+0

Ok, ich sehe ... Ich werde versuchen zu sehen, ob ich beides machen kann, es wird wahrscheinlich in Zukunft nützlich sein. Vielen Dank! – Pablo

0

Sie müssen Javascript verwenden, um den Status Ihrer langen laufenden Anforderung zu überprüfen. Sobald es abgeschlossen ist, können Sie umleiten.

Fügen Sie eine Aktion hinzu, die den aktuellen Status Ihrer Operation wiederherstellt, z.

public JsonResult GetLoadStatus(){ 
    //Get status from somewhere 
    bool isLoaded = ... 
    return Json(isLoaded, JsonRequestBehavior.AllowGet); 
} 

Auf Ihrer Seite, vorausgesetzt, Sie haben jQuery (nicht getestet haben):

<div id="LoadStatus">Loading...</div> 


<script> 
    var loadingCompleted = false; 

    function checkStatus(){ 
     $.get('/MyController/GetLoadStatus') 
      .done(function(isLoaded){ 
       if(isLoaded){ 
        loadingCompleted = true; 
        window.location.href = "/resulturl"; 
       } 
      }) 
      .fail(function(){ 
       alert("Error getting load status"); 
      }) 
      .always(function(){ 
       //Whether the call to your GetLoadStatus method failed or succeeded, always check again in 1 second. 

       if(loadingCompleted === false){ 
        setTimeout(checkStatus, 1000); 
       } 
      }); 
    } 

    checkStatus(); 
</script> 
+0

Interessant! Mein erster Ansatz war, so etwas zu tun, aber ich konnte es nie wirklich zum Laufen bringen. Ich werde auch versuchen, diesen Ansatz funktionieren zu lassen (wenn auch nur zu lernen). – Pablo