如何从多用户编辑锁定asp.net页面?

时间:2009-05-07 18:33:57

标签: c# asp.net

我有一个页面,其中包含一系列经过身份验证的用户可以更改的复选框。我需要让这个页面一次只能由一个人编辑。因此,如果用户进入并编辑其中一个复选框,则没有其他人可以进入该页面并更改其他复选框。

我考虑过编辑页面链接和只读页面链接(禁用所有控件),然后在用户进入编辑模式时设置数据库标志,但我担心的是我不知道用户是否更改了某些内容,然后只是x'd离开浏览器/应用程序,锁定其他人。

这是公司的内部应用程序。有没有人做过这样的事情?

任何想法,想法或建议?

由于

6 个答案:

答案 0 :(得分:5)

我们在较旧的ASP应用程序上拥有此功能。用户将使用某种类型的主键加载数据。我们输入一个DB条目来“锁定”该页面。如果他们正确地在网站上移动,那么它将在那时解锁资源。

打开此页面的其他用户将收到该页面被锁定且呈现只读版本的指示。

编写一个unPageUnload AJAX调用来重置锁定浏览器关闭是非常简单的。我们不认为这是一个很大的问题,如果超过4个小时,那么旧的锁只会被晚间过程清除。

我们的情况是页面与特定的数据区域相关联。如果这是一个通用的配置屏幕,我认为一个更加动态的AJAX解决方案可以推动更新并ping更改可能是有意义的。您必须在收到第一个更新后决定是否要禁用其他更改,或者对数据实施冲突检测。

页面数据的某种类型的散列可能会使这更容易检测到更改。

答案 1 :(得分:2)

你做你说的话,但添加一个客户端计时器,它将ping服务器并告诉你它们仍在那里。如果你没有在x分钟内获得ping,你可以让新用户进入编辑模式,但也许会警告他们(或不是)。

答案 2 :(得分:1)

让所有用户编辑此页面以及脚本如何检查页面更新怎么样?就像SO一样,当你输入一个答案时,上面会出现一条橙色信息,上面写着“至少有一个新答案已经发布”。您可以显示类似“自上次打开页面以来页面已被修改”。

ASP.NET AJAX中有类似计时器的东西。您可以使用它与服务器通信以发送“IN EDIT”状态更新。你甚至可以走得更远。假设您每隔15秒发送一次“LOCKOUT REQUEST”请求,并且您希望从服务器收到“LOCKOUT GRANTED”响应。如果未收到响应,则禁用页面上的所有控件,直到下一个请求收到确认(之前的消息可能已在网络中丢失)。这样,如果一个用户关闭浏览器,则另一个用户不必等待很多分钟或几小时才能获得编辑权限。

基本上,您需要针对关键部分概念的分布式实现。它通过HTTP实现它是一项挑战。但这是一个非常有趣的挑战,不是吗?

答案 3 :(得分:1)

如果您试图阻止两个用户更新数据库记录并相互覆盖,那么检测它可能比阻止它更容易。

对此策略是在记录中包含“版本”字段,并在呈现页面时将其保存在隐藏字段中。

然后,您只需将其作为更新的条件(即UPDATE ... WHERE ID = myID AND VERSION = myversion) - 如果您的更新返回0行,您就知道其他人修改了数据,然后您可以决定要做什么 - 重新加载新数据,为用户提供比较它们的机会等。

答案 4 :(得分:0)

扩展锁定的替代方法怎么样?

由于您似乎正在操纵相对少量的数据,因此将数据的原始状态的编码版本放在隐藏的表单字段(或日期戳,尽管这不太可靠;将其中的哈希值)更为礼貌值适用于大量数据)。在事务中,根据隐藏的表单值检查数据库的状态;如果自用户提交更改后原始记录已更改,则拒绝更新。如果没有,请接受更新,并提交交易。

答案 5 :(得分:0)

另一种方法可能是拥有一个包含锁定项目的地图或字典的Application变量。

因此,当一个用户点击编辑时,在AppVariable Map或Dictionary中添加一个条目,Key设置为正在编辑的字段的主ID。然后,对于所有进一步的请求,当它们在记录之间切换时,检查地图中的ID以及是否正在编辑它,切换任何更新按钮。如果你想要AJAXy,添加一个计时器和一个UpdatePanel并轮询以查看锁定何时被释放,然后使用更新的数据刷新页面并再次启用更新按钮。

或者,作为稍微更大的UI,允许用户在等待锁定释放时进行编辑(要删除的Map项目),然后在删除它时,将他们一直在处理的字段与更新的字段进行比较数据库值并允许它们覆盖/合并它们的更改。

唯一真正的缺点是,1)您需要为要锁定/解锁的每个表创建一个应用程序级别的字典或映射。 2)如果你进入webfarm环境,它会中断,你必须使用不同的系统。

这有意义吗?