ASP.NET中身份验证会话超时时控件值丢失

7
我有一个使用Forms验证的ASP.NET网站。超时时间为20分钟。
我注意到如果用户只填写了一半表单,然后超时了,他们将被重定向到登录页面,填写完毕后会被重定向回表单,但是控件内容为空。
我曾经以为ASP.NET在这种情况下会使用一些诡计来重新填充表单控件。
我应该做出哪些更改才能确保它进行重新填充?
2个回答

1

我认为解决您的问题的最佳方法是在web.config中的forms身份验证元素上将slidingExpiration属性设置为true。这样,当用户花费超过20分钟填写表单时,他/她只会失去自己的数据。

问题出现的原因是asp.net通过称为viewstate的概念来“记住”已在表单中输入的值,它基本上只是一个隐藏的表单字段。当服务器重定向到登录页面时,所有表单字段都会丢失,因为重定向不能包含POST数据。

如果您希望用户能够花费超过20分钟来填写表单,则可以考虑在包含表单的页面上添加一些javascript,每x分钟向服务器发出ajax调用。使用滑动过期,每次触发ajax调用时,它都会重置会话过期时间,因此只要用户查看包含表单的页面,就永远不会注销用户。


我知道也有跨页面提交的机制。我认为这可能是一种不错的默认机制,用于将视图状态从原始页面经过登录页面并返回到原始页面中。但可悔的是没有! - David
顺便感谢你的回答,这正是我在寻找的。不过,我并不喜欢有效地禁用身份验证超时的想法。我需要好好考虑一下。 - David

0

您可以通过将 AJAX 风格的 WebMethod 附加到 onChange 事件上,动态地将每个控件的内容保存到 Session 中。

使用此方法,只要用户每隔 20 分钟认真填写至少一个控件,Session 就不会超时。


我不理解这个解决方案。如何使用JavaScript修改页面的视图状态,考虑到它是编码的?当ViewState本身没有被保留时,将东西存储在ViewState中有什么帮助呢?正如Klaus所描述的那样,它的AJAX部分将防止超时。 - David
Page.ViewState 在 WebMethod 中实际上是不可用的(据我所知),因此我将修改我的答案。那么,我的答案中唯一剩下的区别就是将 AJAX 与 onChange 事件连接起来。谢谢。 - LesterDove

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接