我有一个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事件上读取页面时,它只声明所有加载事件都已完成。
有谁知道我应该如何实现这个目标?我这样做是完全错误的吗?
谢谢,
伊恩
答案 0 :(得分:3)
答案 1 :(得分:1)
答案 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>