2010-05-25 13 views
0

J'ai un UserControl qui est essentiellement un TextBox avec des validateurs intégrés facultatifs. Pour le moment, il s'agit simplement d'un RequiredFieldValidator et d'un RegexValidator. Il est facile d'exposer les propriétés de UserControl qui sont passées à ces validateurs et de me permettre de définir le RegEx par exemple.Envelopper CustomValidator dans un UserControl, mais autoriser l'accès

Maintenant, je voudrais ajouter un CustomValidator et permettre à l'utilisateur d'ajouter une fonction de validation côté serveur ... et cela me cause quelques problèmes. Quelle est la syntaxe appropriée pour cela? J'ai essayé simplement d'ajouter une propriété ServerValidateEventHandler, mais lorsque je tente d'utiliser ce que je reçois une erreur d'exécution:

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

Ai-je besoin d'exposer un délégué d'une autre manière? Cela devrait être facile ... Il me manque une petite clé. S'il vous plaît noter, j'essaye d'ajouter un CustomValidator à une page qui utilise le UserControl ... Je veux que l'utilisateur spécifie un gestionnaire pour la validation personnalisée sur l'usercontrol lui-même. (oui, c'est un peu un Frankencontrol)

Répondre

1

Il existe une solution simple; au lieu d'une propriété publique, utilisez un événement public!

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

ASP.NET exposera l'événement avec le préfixe "on" - donc "ServerValidate" devient "OnServerValidate"

Par exemple, dans le ASPX ou ASCX entrez: OnServerValidate = "MyMethod " où MyMethod est la méthode personnalisée que vous souhaitez exécuter, et il a la signature définie par le délégué ServerValidateHandler:

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

Si vous voulez transmettre des informations spéciales à votre gestionnaire, vous pouvez créer y notre propre classe eventargs (par ex. MyEventArgs: EventArgs) et mettez à jour le délégué pour transmettre ce type au lieu de EventArgs. Si vous avez besoin d'accéder au gestionnaire vous-même, vous pouvez faire ce qui suit (ce code suppose qu'il y aura au maximum une seule méthode de rappel, mais vous pouvez le modifier pour en autoriser davantage en utilisant une collection de gestionnaires):

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

Bien sûr, si vous n'avez pas besoin de ces extras, il simplifie à:

public event EventHandler ServerValidate;