如何处理表单提交ASP.NET MVC后退按钮?

时间:2010-04-13 08:54:26

标签: asp.net asp.net-mvc back-button

我有一个表单,允许用户键入数据然后提交。 如果一切都在这个动作结果上运行良好,那么我会将用户重定向回感谢页面。

我现在的问题是,当用户点击后退按钮时,他们将能够返回到表单页面,输入仍然在那里。

如果用户再次点击提交,我将获得一些潜在的奇怪错误。

所以就asp.net mvc而言,处理点击后退按钮的用户的最佳方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:8)

此解决方案适用于整个控制器或特定操作,只需添加[NoCache]

即可
 /// <summary>
 /// Prevent a controller or specific action from being cached in the web browser.
 /// For example - sign in, go to a secure page, sign out, click the back button.
 /// <seealso cref="https://stackoverflow.com/questions/6656476/mvc-back-button-issue/6656539#6656539"/>
 /// </summary>
public class NoCacheAttribute : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var response = filterContext.HttpContext.Response;
        response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        response.Cache.SetValidUntilExpires(false);
        response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        response.Cache.SetCacheability(HttpCacheability.NoCache);
        response.Cache.SetNoStore();
    }
}

在您的代码中:

[NoCache]
[Authorize]
public class AccountController : Controller
{ ... }

最初发布在此处:MVC Back button issue

答案 1 :(得分:1)

“潜在的奇怪错误”是什么意思?我怀疑用户会再次点击提交,除非他们想再次发布完全相同的内容。我不想要重复的帖子,在发布之前检查数据库中的内容。

如果确实不希望人们两次发布相同的表单,请添加一个随机生成的数字(只需确保它足够随机以避免冲突,或使用类似用户ID的组合和一个精确的时间戳)进入一个隐藏的字段,保存与您的数据,并在保存任何内容之前检查它是否已存在于您的数据库中。

答案 2 :(得分:0)

使用此代码

set.seed(42) # For reproducibilty
df = data.frame(x.v = seq(0, 1, 0.025),
                y.v = runif(41))
straight.line = data.frame(Inter = 0, Slope = 1)