表示层中特定控件的审计跟踪
本文关键字:审计跟踪 控件 表示层 | 更新日期: 2023-09-27 18:11:08
我有一个使用ASP的项目。NET与MS SQL数据库,使用LINQ类,并要求对特定字段进行更改跟踪/审计跟踪。由于项目相当大,手动添加审计跟踪功能会很麻烦。此外,跟踪数据层上的所有更改将不是完美的(因为我还必须处理外部数据,来自HTTP POST发送的JSON文件,等等…)。
我的想法是通过扩展现有的ASP来实现通常的审计跟踪功能(在各种其他问题/教程中讨论和显示,不应该是这里的问题)。. NET控件(如asp:TextBox, asp:CheckBox, asp:DropDownList等)使用一个简单的属性"bool auditTrail",可以在我的.aspx文件中设置为TRUE,然后跟踪代码隐藏的变化。这个功能只是简单地存储原始页面,元素#ID,旧值+新值,登录用户和时间戳。
这是可以做到的-或多或少容易?说实话,我对ASP很坚定。. NET,但在扩展现有类方面不那么坚定。或者整个想法有很大的缺陷,你可以给我指出正确的方向?我找到了使用NHibernate的解决方案,但是,如果可能的话,我宁愿避免外部依赖。
感谢您的输入!
为了澄清我想要的,一些(伪)代码。当然,控件的标签前缀需要相应地设置等(因为我不认为我可以覆盖asp:WebControl类本身…我能吗?)
page.aspx
<asp:TextBox runat="server" ID="tb1" audit="true"></asp:TextBox>
<asp:DropDownList runat="server" ID="ddl1" audit="true"></asp:DropDownList>
page.aspx.cs
no further code regarding the 2 controls...
AuditControls.cs
public class TextBox : System.Web.UI.WebControls.TextBox
{
public bool Audit { get; set; }
}
public class DropDownList : System.Web.UI.WebControls.DropDownList
{
public bool Audit { get; set; }
}
到此为止,这就是我想在我的应用程序中拥有的原始轮廓。缺少的是如何在一个尽可能通用的解决方案中添加审计跟踪本身的功能。在控件呈现(/填充数据)时存储值,并检索控件的历史值,以便可能在另一个(弹出式)元素中显示它。也许在单独的元素中加载数据是个好主意:
page.aspx
<asp:TextBox runat="server" ID="tb1" audit="true"></asp:TextBox>
<asp:MyHistoryViewer runat="server" ID="history_tb1" TargetID="tb1" />
AuditControls.cs
public class MyHistoryViewer
{
public string TargetID {get;set;}
// program logic to retrieve the value history of the control with ID=TargetID from DB
// render it as a, let's say HTML table...
}
最后,为了存储所有更改的值,某种"不可见"的ChangeTracker可能会坐在.aspx页面上,他的眼睛盯着我所有的控件,属性审计设置为true。这个Changetracker将在页面收到Postback后触发,检查当前WebControl字段值(无论是TextBox/DropDownList/…)是否与最新值不同。如果不是,它将数据写入数据库…?
大声思考-有什么建议或提示,你有这方面的经验吗?还有更好的方法吗?
还有"Thinking out loud"…我认为你在你的问题中建议的控件是服务器控件。这意味着在选择/单击时,它们将产生回发。@konrad_pe我可以建议,也许一个HttpModule将是一个好主意来解决你的问题?因为每个请求都会命中HttpModules,所以你可以查询引起请求的控件的表单数据,并从那里获取它。
我在这里读到类似的内容:
我希望这能给你另一种观点,你会发现它足够有趣去探索。好运!