我正在使用带有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");
}
实现这一目标的最佳方式是什么,无论是我的想法还是其他方式?
答案 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>
}
...
这并没有真正回答我的具体问题 - 我决定走另一条路。因此,当用户提交表单时,他们会再次看到相同的表单,并在最顶部显示“谢谢”消息。