在MVC中,有没有办法在控制器中可靠地暂停执行X秒数?

时间:2014-01-08 22:16:17

标签: c# asp.net-mvc

我正在使用带有C#的ASP.NET MVC5。我有一个表单,在用户填写表单并单击“保存”后,我有一个RedirectToAction("ThankYou") - 将它们发送到“谢谢”页面。这是我想暂停执行的地方,比如1500毫秒。因此,“ThankYou”视图将保留在屏幕上1500毫秒,然后我想进一步将它们重定向回到表单。这是我的查看代码 - 非常简单,简单,香草:

public ActionResult ThankYou()
{
    return View();
}

我想做的是:

public ActionResult ThankYou()
{
    // pause execution for 1500 milliseconds
    return RedirectToAction("Create");
}

实现这一目标的最佳方式是什么,无论是我的想法还是其他方式?

4 个答案:

答案 0 :(得分:4)

如果您在服务器端暂停执行,则只会显示服务器响应时间延长1.5秒。您需要返回ThankYou视图,让浏览器等待1.5秒,然后将用户重定向到相应的URL。

我可以通过两种方式来做到这一点:

仅限Javascript解决方案

<script type="text/javascript">
window.onload = function ()
{
    setTimeout(RedirectToUrl, 1500);
}
function RedirectToUrl()
{
    window.location = "/New/Url/";
}
</script>

JQuery解决方案

<script type="text/javascript">
   $(function(){
      window.setTimeout(function(){
           window.location = "/New/Url";
       },1500);
   });
</script>

元标记解决方案

<meta http-equiv="refresh" content="2;url=http://mywebsite.com/New/Url">

我认为meta标签不会取小数,但我可能会弄错。 jQuery版本更快更容易,但是元标记方法适用于所有浏览器,即使在javascript中也是禁用的。

答案 1 :(得分:1)

我完全同意其他人关于正确的解决方案(客户端JavaScript或<meta>代码重定向),因此请将以下内容作为旁注。

永远不要使用Thread.Sleep阻止服务器线程。如果你真的需要暂停服务器端执行,例如要模拟高延迟网络,请使用asynchronous ASP.NET,例如:

public async Task<ActionResult> ThankYou()
{
    await Task.Delay(2000);
    return RedirectToAction("Create");    
}

这可以扩展到许多其他阻止调用,但同样,是您的方案的解决方案。

答案 2 :(得分:0)

在javascript中使用setTimeout来电。这样,您的视图加载和javascript将在1500毫秒后调用新的URL或重定向。

setTimeout(function(){
    // code to redirect to a new url
}, 1500);

https://developer.mozilla.org/en-US/docs/Web/API/Window.setTimeout

答案 3 :(得分:0)

我使用的解决方案是在Create POST操作中,在成功创建请求后,我只返回相同的Create视图,但在此之前,我添加了一条“谢谢”消息到我的ViewBag,如下:

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(string appId, AppFeedback feedback)
        {
            feedback.CreatedDate = DateTime.Now;
            feedback.CreatedBy = HttpContext.User.Identity.Name;

            response = client.PostAsJsonAsync("api/appfeedback", feedback).Result;
            if (response.IsSuccessStatusCode)
            {
                ViewBag.CustomMessage = "Thank you for submitting feedback!";
                return View("Create", new AppFeedback() { AppId = appId });
            }
            else
            {
                LoggerHelper.GetLogger().InsertError(new Exception(string.Format(
                    "Cannot create a new feedback record due to HTTP Response Status Code not being successful: {0}", response.StatusCode)));
                return View("Problem");
            }
        }

然后,在我的Create视图中,在最顶部,我有:

<div class="content" style="margin-left:30px;">
        @if (ViewBag.CustomMessage != null)
        {
            <div>@ViewBag.CustomMessage</div>
        }
...

这并没有真正回答我的具体问题 - 我决定走另一条路。因此,当用户提交表单时,他们会再次看到相同的表单,并在最顶部显示“谢谢”消息。