我想确保用户不在两个不同的浏览器标签或窗口(同一个Web浏览器实例)中编辑相同的表单数据。目的是阻止用户在持续很长时间的过程中意外覆盖自己的数据。在服务器上,通过屏幕输入的持续数据被收集到会话中。
假设对于任何浏览器,所有选项卡和窗口都在它的相同实例中运行(即不是每个都在单独的进程中)。显然,浏览器选项卡和窗口在这种情况下共享相同的cookie,因此对于可行的解决方案而言,cookie修改似乎是不可能的。这也是他们共享相同会话状态的原因。
考虑到表单已经创建并且这是最后一步,我如何使用ASP.NET,希望轻松来监督这个 “特征”?
答案 0 :(得分:3)
您可以尝试这样的事情:
将整数存储为Session [“LastRequest”]。将其放入页面上的隐藏字段中。对于每个请求,您都要在整数中添加一个请求。
在回发时,通过检查Request.Form [“LastRequest”]是否等于Session [“LastRequest”],确保没有其他请求。
如果您需要在回发发生之前检查多个实例,您应该可以使用AJAX调用来执行此操作。
答案 1 :(得分:2)
每次渲染表单时,请将某些隐藏字段的值设置为随机字符串。将相同的字符串存储在会话状态中。当用户回发时,检查两个值是否相等。如果没有,这必须重新发布。
答案 2 :(得分:1)
您无法区分同一页面的两个http POST,即使它们来自不同的标签页。
这就像着名的后退按钮问题 - 他们可以发布,回复和重新发布。
通常的解决方案是隐藏跟踪字段,但要使它们可靠是非常困难的。
如果它是一个向导类型的过程,它应该很容易检测它们是否覆盖了已经输入的字段,并显示警告。
答案 3 :(得分:0)
在呈现指定页面期间,生成GUID并保存在会话中。编写一个通用处理程序,跟踪指定页面的情况,不存在两个GUID。
以下数据结构将有所帮助。
class MultipleOpenedPage{
string guid;
string pageURL;
DateTime timeStamp;
bool IsMultiplePageOpened(List<MultipleOpenedPage> list)
{
///logic
}
}
答案 4 :(得分:0)
由于网络的无状态特性,我不相信有一种可靠的方法可以区分两个浏览器窗口。但是,您可以在Session中存储一个标志,该标志表示正在执行给定的长时间运行进程。这样,您不必关心他们是否尝试从同一浏览器窗口或多个浏览器窗口重新运行该过程。诀窍是处理进程失败的情况,并且没有机会重置标志,以便可以再次运行进程。
答案 5 :(得分:0)
我通过创建一个继承自System.Web.UI.Page和page_load / init事件的基类来创建一个包含特定于用户实例的信息的对象。
这就是,创建的每个新页面都是它自己的对象实例,因此可以维护不同的状态/属性,可用于对同一页面上的数据进行不同的编辑。
只是一个想法,因为它有点不同的方式。