使用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);
}
所以事件樹變得
- 用戶控制Page_Init =>鉤InitComplete處理機
- 頁(CSS)Page_Init =>綁定數據
- 用戶控制Page_InitComplete =>初始化控制
這不適合我,但建議是健全的。我只是沒有提供足夠的關於這個問題的信息,以便你知道這個:) Accepted。 – jevakallio 2010-07-12 08:08:37
啊......簡單 – andy 2010-07-12 08:08:50