C# 用于实体更改跟踪的Asp.net事件

C# 用于实体更改跟踪的Asp.net事件,c#,asp.net,C#,Asp.net,我有一个asp.net页面,其中有许多代表多个数据库实体的控件。我希望跟踪这些实体的任何数据何时更改 如果我添加一个页面成员,如 public Page1 : System.Web.UI.Page { protected bool Entity1HasChanged { get;set; } protected void RegisterChange(object sender, EventArgs e) { Entity1HasChanged = t

我有一个asp.net页面,其中有许多代表多个数据库实体的控件。我希望跟踪这些实体的任何数据何时更改

如果我添加一个页面成员,如

public Page1 : System.Web.UI.Page
{
    protected bool Entity1HasChanged { get;set; }

    protected void RegisterChange(object sender, EventArgs e)
    {
        Entity1HasChanged  = true;
    }
}
然后,对于每个控件OnTextChanged事件或等效事件,我调用一个方法,将此布尔值设置为true

然后,我想在所有控制事件完成后运行一个方法,该方法执行一些数据库更新。我可以连接到哪个页面事件来执行此操作?在LoadComplete事件上读取页面时,它仅表示所有加载事件都已完成

有人知道我应该如何做到这一点吗?我这样做完全是错误的吗

谢谢

伊恩

把和作为你的出发点

把和作为你的出发点

尝试使用预渲染

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

请尝试使用PreRender


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

这是一个非常好的问题。我胡乱搞了些我认为会奏效的东西。您可以创建从TextBox继承的won 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);
        }
    }
}
命名空间服务器控制1
{
[默认属性(“文本”)]
[ToolboxData(“”)
公共类TextBoxWithChange:TextBox
{
[可装订(真实)]
[类别(“外观”)]
[默认值(“”)
[可本地化(正确)]
公共图书馆已经被改变了
{
得到
{
bool hasEntityChanged=(bool)视图状态[“hasEntityChanged”];
返回已更改的实体;
}
}
受保护的覆盖无效渲染内容(HtmlTextWriter输出)
{
输出。写入(文本);
}
}
}
然后,您可以编写一个小jQuery脚本,在客户端OnTextChanged事件触发时更改该属性。在提交表单时,您可以查询这些文本框的HasEntityChanged属性

对于本例,我将服务器控件放在它自己的库中,并按如下方式注册它:

<%@ Register TagPrefix="MyCompanyName" Namespace="ServerControl1" Assembly="ServerControl1" %>
    <MyCompanyName:TextBoxWithChange ID="ChangerTextBox" runat="server" HasEntityChanged="false"></MyCompanyName:TextBoxWithChange>

然后,您可以在页面上声明它,如下所示:

<%@ Register TagPrefix="MyCompanyName" Namespace="ServerControl1" Assembly="ServerControl1" %>
    <MyCompanyName:TextBoxWithChange ID="ChangerTextBox" runat="server" HasEntityChanged="false"></MyCompanyName:TextBoxWithChange>

这是一个非常好的问题。我胡乱搞了些我认为会奏效的东西。您可以创建从TextBox继承的won 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);
        }
    }
}
命名空间服务器控制1
{
[默认属性(“文本”)]
[ToolboxData(“”)
公共类TextBoxWithChange:TextBox
{
[可装订(真实)]
[类别(“外观”)]
[默认值(“”)
[可本地化(正确)]
公共图书馆已经被改变了
{
得到
{
bool hasEntityChanged=(bool)视图状态[“hasEntityChanged”];
返回已更改的实体;
}
}
受保护的覆盖无效渲染内容(HtmlTextWriter输出)
{
输出。写入(文本);
}
}
}
然后,您可以编写一个小jQuery脚本,在客户端OnTextChanged事件触发时更改该属性。在提交表单时,您可以查询这些文本框的HasEntityChanged属性

对于本例,我将服务器控件放在它自己的库中,并按如下方式注册它:

<%@ Register TagPrefix="MyCompanyName" Namespace="ServerControl1" Assembly="ServerControl1" %>
    <MyCompanyName:TextBoxWithChange ID="ChangerTextBox" runat="server" HasEntityChanged="false"></MyCompanyName:TextBoxWithChange>

然后,您可以在页面上声明它,如下所示:

<%@ Register TagPrefix="MyCompanyName" Namespace="ServerControl1" Assembly="ServerControl1" %>
    <MyCompanyName:TextBoxWithChange ID="ChangerTextBox" runat="server" HasEntityChanged="false"></MyCompanyName:TextBoxWithChange>


这将起作用,但每个页面都需要这样做。这将不会遵循枯燥的原则这将工作,但每一页将需要这样做。它不会遵循干燥原理