Оберните CustomValidator в UserControl, но разрешите доступ к нему - PullRequest
0 голосов
/ 25 мая 2010

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

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

1 Ответ

1 голос
/ 09 марта 2011

Есть простое решение; вместо публичной собственности используйте публичное мероприятие! ​​

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;
...