2010-04-13 81 views
5

我有一个表格,允许用户键入数据,然后提交。 如果在这个操作结果中一切正常,那么我会将用户重定向到一个感谢页面。如何处理表单提交ASP.NET MVC后退按钮?

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

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

所以在asp.net mvc方面,处理用户点击后退按钮的最佳方式是什么?

的感谢!

回答

1

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

如果你真的不希望有人发帖相同的形式两次,把一个随机生成的数字(只是确保它足够随机以避免碰撞,或使用类似的用户ID的组合和精确的时间戳)保存到一个隐藏字段中,保存这些数据并在保存之前检查它在数据库中是否已经存在。

+0

由于asp.net mvc是无状态的,我只是想,也许他们有一个新的shebang方法或最佳实践来处理这个问题。 – melaos 2010-04-13 16:51:14

+0

当人们声称某种方法是“最佳实践”时,我不喜欢。 – 2010-04-13 17:09:01

+0

哈哈是真的,但有丑陋的黑客,然后有更好的尝试和测试替代品的使用。我尽量避免前者。 – melaos 2010-04-14 00:54:53

6

该解决方案完全适用,那么整个控制器或一个特定的动作,只需添加[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