2010-05-25 2 views
0

У меня есть UserControl, который по существу является только TextBox с дополнительными встроенными валидаторами. На данный момент это всего лишь RequiredFieldValidator и RegexValidator. Легко просто выставить свойства в UserControl, которые проходят через эти валидаторы и позволяют мне установить RegEx, например.Оберните CustomValidator в UserControl, но разрешите доступ к нему

Теперь я хотел бы добавить 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 ... Я хочу, чтобы пользователь указывал обработчик для пользовательской проверки на сам пользовательский контроль. (да, это немного Frankencontrol)

ответ

1

Существует простое решение; а не публичную собственность, используйте публичное мероприятие!

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

ASP.NET выставит событие с "On" приставкой - так "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; 
Смежные вопросы