显示ViewBag消息几秒钟,然后重定向到另一个操作

时间:2016-06-15 05:41:17

标签: c# asp.net-mvc viewbag redirecttoaction

我有一个Action方法,它将消息设置为ViewBag并返回到HomePage,例如,

 ViewBag.errormsg = "Some Temporary message";
 return RedirectToAction("Index", "Dashboard");

根据这种方法,用户将无法在该页面中看到ViewBag.errormsg,因为它会立即重定向到仪表板,但我希望在重定向到仪表板后显示该消息1到2秒。

我尝试使用Task.WaitAll();方法延迟RedirectToAction的呼叫,就像这里一样,

ViewBag.errormsg = "Some Temporary message";
Task.WaitAll(Task.Delay(2000));
return RedirectToAction("Index", "Dashboard");

但这是一个相当愚蠢的工作,ViewBag在调用return方法之前不会显示消息,有没有简单的方法来实现它?

我认为TempData不适用于我的情况,因为我不想将ViewBag消息显示给HomePage,它应该显示在当前页面中。

2 个答案:

答案 0 :(得分:0)

您无法在服务器端执行此操作,您必须使用javascript。

您可以使用:

window.setTimeout(function(){
window.location.href='your URL';
}, 2000);

答案 1 :(得分:0)

我想出了你想要做什么的过程:

Controller => Current view => Redirect => Dashboard view

首先,在当前视图中包含您的消息:

ViewBag.errormsg = "Some Temporary message";
return View("CurrentView");

设置HTML元素以显示该消息并在当前CSHTML视图上使用JS超时:

<script type="text/javascript">
function onMessageShow() {
    var msg = "@ViewBag.errormsg";
    // if the message exists, set redirection to dashboard page
    if (msg != null || typeof msg !== "undefined") {
         setTimeout('redirect', 5000); // 5 seconds for example
    }
}

function redirect() {
    window.location.href = "@Url.Content("Index", "Dashboard")";
    // or use window.location.replace, depending what your need
}
</script>

<html>
<body onload="onMessageShow()">
    <!-- simplified for brevity -->
    <p>@ViewBag.errormsg</p>
    <!-- simplified for brevity -->
</body>
</html>

Task.WaitAll Task.Delay在服务器端一起使用以延迟服务器端进程(包括async进程)的执行,在您的情况下有客户端事件重定向到消息出现后的索引页面。

CMIIW。