2009-12-16 104 views
1

我有一個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事件的頁面時,只會指出所有加載事件都已完成。

有誰知道我應該怎麼做到這一點?我是否完全錯誤地做這件事?

感謝,

伊恩

回答

1

試試OnPreRender。

ASP.NET Page Life Cycle Overview

這也將仍然允許你(如果你想顯示狀態框地說,操作完成例如)修改頁面的輸出,一旦你完成了數據庫操作。

+0

這會起作用,但每個頁面都需要這樣做。哪個不會遵循DRY原則 – Perpetualcoder 2009-12-17 16:09:24

1

這是一個非常好的問題。我想到了一些我認爲會起作用的東西。你可以創建你贏得文本框,從文本框繼承:

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); 
     } 
    } 
} 

然後,你可以寫一個小jQuery腳本改變該屬性的客戶端OnTextChanged事件觸發時。在提交表單後,您可以查詢任何這些TextBox的HasEntityChanged屬性。

在這個例子中,我把它自己的圖書館服務器控件註冊這樣的:

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

然後你就可以宣佈它在網頁上是這樣的:

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