管理系统中的ASP.NET冲突检测

时间:2012-03-01 18:43:24

标签: asp.net sql postback conflict

我正在尝试在管理系统中实现冲突检测,即Alice正在编辑页面; Bob编辑同一页面并在Alice之前保存。为了防止Alice覆盖Bob的更改,我需要让她知道发生了更改,以及她将覆盖的确切字段以及Bob将其保存为的内容。 (这都是使用SQL)。

我已经尝试将相关对象存储在Page_Load上,但是当页面被回发时,这会消失。有没有办法坚持对象而不必写出令人讨厌的序列化代码?或者确实是一种更好的方法。

1 个答案:

答案 0 :(得分:2)

如果对象不是很复杂,只需将其标记为[Serializable]并将其推入ViewState或SessionState,然后它将在回发中存活(尽管如果将其放入ViewState,则需要将其放回到ViewState中)在回发之后,在再次呈现页面之前查看状态。)

另一种选择,如果对象有点复杂,或者你真的不想保存那些数据,那么确保有问题的表有LastUpdated和LastUpdatedBy的字段,并确保每次都写入这些字段。已更新。然后你可以做的是,在渲染Alice的页面时,将LastUpdated日期写入隐藏字段(或viewstate)。

然后,在尝试保存时,将数据库的LastUpdated中的记录与呈现页面时附加的记录进行比较。如果它们相同,请继续执行更新。如果它们不同,那么你拥有Alice想要输入的值,通过你从回发中获得它们,并且你可以通过日期检查获得Bob的更改。然后,您可以显示所需的任何UI。

编辑:如果你想显示Alice在加载页面时的原始值,还有其他一些选项。

第一个,技术最低的技术是使每个可编辑字段对应一个HiddenField。您在填充控件的同时加载它们,然后使用它来显示原始值。

另一个选择,如果您使用ObjectDataSource将使用它的ConflictDetection功能: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.objectdatasource.conflictdetection.aspx

在此属性和OldValuesParameterFormatString属性之间,控件将原始值传递给Update函数以及更新的值。