2010-07-08 60 views
2

使用ASP.NET 4.0項目,該項目使用用戶控件根據存儲在數據庫中的定義動態生成表單。一個表單字段應該是這樣的:ASP.NET數據綁定回發

<usc:RefControl ID="ctrlUser1" 
    ReferenceFieldId='product.user1' 
    ValidationFormat="^\d+\.?\d{0,2}$" 
    runat="server"/> 

在幕後控制其基於該RefControl.ValidationFormat財產的RegularExpressionValidator。

這很好,但問題是,這種架構只允許我們用正則表達式進行驗證。現在我需要根據用戶的喜好(不依賴於他們的UICulture)添加日期格式驗證。

不願意重構整個用戶控件設置,我需要能夠將一個即時正則表達式模式傳遞給ValidationFormat屬性。目前我使用數據綁定表達式的屬性綁定到一個頁面實例方法:

<usc:RefControl ID="ctrlUser2" 
    ReferenceFieldId='product.user2' 
    ValidationFormat="<%# GetUserDateValidationFormat()%>" 
    runat="server"/> 

後面的代碼:

/// <summary> 
/// Returns a regular expression that validates the current user's date format 
/// </summary> 
public string GetUserDateValidationFormat() 
{ 
    //... 
} 

作品在第一頁加載不錯,但在隨後的回發確認沒有按沒有工作。我認爲問題是,數據綁定表達式根本沒有評估,但我不知道我明白爲什麼。我在Page_Init中調用Page.DataBind()是否Page.IsPostBack,所以不應該這樣工作?

如果你看到我在吠叫錯誤的樹,也歡迎對同一問題的任何替代解決方案。

編輯

設法解決這個問題。問題在於ASP.NET頁面生命週期在頁面自己的事件之前調用用戶控件的事件。在頁面上的數據綁定可能發生之前,控制值正在被初始化。

因爲我仍然需要在Page_Load之前完成控件初始化,以將控件訂閱到viewstate,我只是將初始化邏輯移動到Page.InitComplete事件中,以便可以首先調用Page.DataBind()。

protected void Page_Init(object sender, EventArgs e) 
    { 
     Page.InitComplete += new EventHandler(Page_InitComplete); 
    } 

所以事件樹變得

  1. 用戶控制Page_Init =>鉤InitComplete處理機
  2. 頁(CSS)Page_Init =>綁定數據
  3. 用戶控制Page_InitComplete =>初始化控制

回答

3

難道你只是在Page_Load()中設置屬性?

public void Page_Load(...) 
{ 
    ctrlUser1.ValidationFormat = GetUserDateValidationFormat(); 
    // do whatever stuff you do 
} 
+0

這不適合我,但建議是健全的。我只是沒有提供足夠的關於這個問題的信息,以便你知道這個:) Accepted。 – jevakallio 2010-07-12 08:08:37

+0

啊......簡單 – andy 2010-07-12 08:08:50