我有一个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,它应该显示在当前页面中。
答案 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。