Asp.net事件的变更跟踪实体

时间:2009-12-16 15:55:50

标签: c# asp.net

我有一个asp.net页面,其中包含许多代表多个数据库实体的控件。我想跟踪这些实体的任何数据何时发生变化。

如果我添加了

等页面成员
public Page1 : System.Web.UI.Page
{
    protected bool Entity1HasChanged { get;set; }

    protected void RegisterChange(object sender, EventArgs e)
    {
        Entity1HasChanged  = true;
    }
}

然后对于每个控件OnTextChanged事件或等效事件,我调用一个将此布尔值设置为true的方法。

然后我想运行一个方法 AFTER 所有控制事件都已完成,这会执行一些数据库更新。我可以勾选哪些页面事件来执行此操作?在LoadComplete事件上读取页面时,它只声明所有加载事件都已完成。

有谁知道我应该如何实现这个目标?我这样做是完全错误的吗?

谢谢,

伊恩

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

尝试OnPreRender。

ASP.NET Page Life Cycle Overview

这也将允许您在完成数据库操作后修改页面输出(例如,如果您想显示状态框以表示操作已完成)。

答案 2 :(得分:1)

这是一个非常好的问题。我想到了一些我认为会起作用的东西。您可以创建从TextBox继承的赢得的TextBox:

namespace ServerControl1
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:ServerControl1 runat=server></{0}:ServerControl1>")]
    public class TextBoxWithChange : TextBox
    {
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public bool HasEntityChanged
        {
            get
            {
                bool hasEntityChanged = (bool) ViewState["HasEntityChanged"];
                return hasEntityChanged;
            }
        }

        protected override void RenderContents(HtmlTextWriter output)
        {
            output.Write(Text);
        }
    }
}

然后,当客户端OnTextChanged事件触发时,您可以编写一个小jQuery脚本来更改该属性。在提交表单后,您可以查询任何这些TextBox的HasEntityChanged属性。

对于这个例子,我将服务器控件放在它自己的库中,并将其注册为:

<%@ Register TagPrefix="MyCompanyName" Namespace="ServerControl1" Assembly="ServerControl1" %>

然后你可以在你的页面上声明它:

    <MyCompanyName:TextBoxWithChange ID="ChangerTextBox" runat="server" HasEntityChanged="false"></MyCompanyName:TextBoxWithChange>