2010-05-25 58 views
0

我有一個用戶控件,它基本上只是一個TextBox,並帶有可選的內置校驗器。目前這只是一個RequiredFieldValidator和RegexValidator。只需將UserControl中的屬性公開給這些驗證器,並允許我設置RegEx爲例。在用戶控件中包裝CustomValidator,但允許訪問它

現在我想添加一個CustomValidator,並允許用戶添加一個服務器端驗證功能......這導致了一些麻煩。這是什麼適當的語法?我嘗試了加入ServerValidateEventHandler屬性,但是當我嘗試使用此我得到一個運行時錯誤:

Cannot create an object of type 'System.Web.UI.WebControls.ServerValidateEventHandler' from its string representation 'valState_ServerValidate' for the 'ServerValidate' property. 

我需要一些其他方式暴露一個委託?這應該很容易......我錯過了一個小關鍵。請注意,我試圖將CustomValidator添加到使用UserControl的頁面中...我希望用戶爲usercontrol自身指定自定義驗證的處理程序。 (是的,這是一個弗蘭肯控制)

回答

1

有一個簡單的解決方案;而不是公共財產,使用公共事件!

public delegate void ServerValidateHandler(object sender, EventArgs e); 
public event ServerValidateHandler ServerValidate; 

ASP.NET會暴露事件與 「開」 的前綴 - 如此 「的ServerValidate」 變成 「OnServerValidate」

例如,在ASPX或ASCX您可以輸入:OnServerValidate =「的MyMethod 「這裏的MyMethod是要執行的自定義方法,它具有由ServerValidateHandler委託定義的簽名:

protected void MyMethod(Object sender, EventArgs e) 
{ 
    // do something... 
} 

如果你想要的特殊信息傳遞到您的處理程序,您可以創建ÿ我們自己的eventargs課程(例如MyEventArgs:EventArgs),並更新委託以傳遞該類型而不是EventArgs。

如果您需要自己訪問處理程序,則可以執行以下操作(此代碼假定最多隻有一個回調方法,但可以通過使用一組處理程序來修改它以允許更多):

public delegate void ServerValidateHandler(object sender, EventArgs e); 
    private ServerValidateHandler _handler; 
    public event ServerValidateHandler ServerValidate 
    { 
     add { _handler = value; } 
     remove { _handler = null; } 
    } 

當然,如果你不需要任何這些額外的,然後將其簡化爲:

public event EventHandler ServerValidate; 
相關問題