审计跟踪表示层中的特定控件

时间:2014-07-01 09:02:10

标签: c# asp.net audit-trail

我有一个使用ASP.NET和MS SQL DB的项目,使用LINQ类并需要特定字段的更改跟踪/审计跟踪。由于项目非常大,手动添加审计跟踪功能将非常麻烦。此外,跟踪数据层上的所有更改并不完美(因为我还必须处理外部数据,来自HTTP POST发送的JSON文件等等)。

我的想法是通过扩展现有的ASP.NET控件(例如asp:TextBox,asp)来实现通常的审计跟踪功能(在各种其他问题/教程中讨论并显示,这里不应该是问题) :CheckBox,asp:DropDownList等),带有一个简单的属性“bool auditTrail”,可以在我的.aspx文件中设置为TRUE,然后跟踪代码隐藏中的更改。这个功能只是说存储原始页面,元素#ID,旧+新值,记录用户和时间戳。

这可以做到 - 或多或少容易?说实话,我在ASP.NET方面非常坚定,但在扩展现有类时却不那么坚定。或许整个想法有一个很大的缺陷,你可以指出我正确的方向?我找到了使用NHibernate的解决方案,但是,如果可能的话,我宁愿避免外部依赖。

感谢您的投入!


澄清我想要的,一些(伪)代码。当然,控件的tagprefix需要相应地设置等等(因为我不认为我可以覆盖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将触发,检查当前WebControl字段值(无论是TextBox / DropDownList / ...)是否与最新值不同。如果没有,它会将数据写入DB ......?

大声思考 - 任何建议或提示,你有这方面的经验吗?有没有更好的办法呢?

1 个答案:

答案 0 :(得分:0)

另外&#34;大声思考&#34; ...我认为您在问题中建议的控件是服务器控件。这意味着在选择/点击时它们会产生回发。 @konrad_pe我可以建议也许一个HttpModule可以解决你的问题吗?因为每个请求都会遇到HttpModules,所以你可以查询导致请求的控件的表单数据并从那里获取它。

我在这里读到类似的内容: Get which control...

我希望这能为您提供另一种观点,并且您会发现它很有趣,可以探索。祝你好运!