返回视图然后在MVC中执行操作

时间:2017-08-04 09:25:58

标签: asp.net-mvc web-services

我有一个链接。使用时,我想加载一个新视图,然后自动调用一个动作。但我只知道在ActionResult方法中加载带有“return”的视图(所以我以后不能调用另一个动作!)。

也许我只是在考虑整件事情,但我无法弄清楚如何以其他方式做到这一点。

我尝试过的一件事是从视图中调用动作,但像@ Html.ActionLink这样的东西需要用户点击,而我希望动作自动触发。

编辑:

由于一些人问,这是我想要做的动机(随意提出更好的方法!):

我想在长时间进程运行时将用户重定向到视图,然后自动将用户重定向到最终视图。第二个操作将调用该进程并在用户完成时重定向。

4 个答案:

答案 0 :(得分:1)

您需要让客户端在页面加载时重定向浏览器,以便自动将其添加到</html>标记之前的视图末尾:

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

虽然如果我们知道您要克服的具体问题,我怀疑有更好的解决方案。

答案 1 :(得分:0)

我只是猜测你要做什么,也许你可以尝试这样的事情

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

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

答案 2 :(得分:0)

您可以使用来自客户端的异步ajax调用在呈现视图后发出另一个请求。

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

e.g。

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

其他是可选参数。

这样您就可以自动触发另一个操作,并可以在成功回调中处理请求的响应。

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

答案 3 :(得分:0)

您需要使用javascript检查长时间运行的请求的状态。完成后,您可以重定向。

添加一个动作来重新设置操作的当前状态,例如

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

在您的页面上,假设您有jQuery(尚未测试过):

<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>