2010-03-16 5 views
0

Je développe une application web dans laquelle je souhaite effectuer un ensemble de validations sur un certain champ (un nom de compte dans le cas spécifique).
Je dois vérifier que la valeur n'est pas vide, correspond à un certain modèle et n'est pas déjà utilisée.
J'ai essayé de créer un UserControl qui agrège un RequiredFieldValidator, un RegexValidator et un CustomValidator, je créé une propriété ControlToValidate comme ceci:ASP.NET: agrégation de validateurs dans un contrôle utilisateur

public partial class AccountNameValidator : System.Web.UI.UserControl { 
    public string ControlToValidate { 
     get { return ViewState["ControlToValidate"] as string; } 
     set { 
      ViewState["ControlToValidate"] = value; 
      AccountNameRequiredFieldValidator.ControlToValidate = value; 
      AccountNameRegexValidator.ControlToValidate = value; 
      AccountNameUniqueValidator.ControlToValidate = value; 
     } 
    } 
} 

Cependant, si j'insère le contrôle sur une page et définissez ControlToValidate à certains ID de contrôle, lorsque la page se charge, une erreur indique Impossible de trouver l'ID de contrôle 'AccountName' référencé par la propriété 'ControlToValidate' de 'AccountNameRequiredFieldValidator', ce qui me fait penser que les contrôles de mon UserControl ne peuvent pas résoudre correctement les contrôles dans la page parent.

Donc, j'ai deux questions:

1) Est-il possible d'avoir des contrôles de validateur à l'intérieur d'un UserControl valider un contrôle dans la page parent?

2) Est-il correct et pratique d'agréger plusieurs contrôles de validation dans un UserControl? Si non, quelle est la manière standard de procéder?

Répondre

1

Répondre d'abord à votre deuxième question - Je ne pense pas que ce soit une bonne idée d '«agréger» les validateurs ensemble de cette façon, sauf si vous incluez les contrôles que vous validez dans le contrôle utilisateur. Trop de travail pour pas assez de gains.

Vous pouvez résoudre ce problème en exposant les propriétés de votre AggregatedValidator pour définir les noms des contrôles à valider et transmettre le code client des contrôles que vous souhaitez valider.

+0

exposer les propriétés sur le validateur agrégé pour définir les noms des contrôles à valider est ce que je fais ... et même avec ClientID cela ne fonctionne toujours pas ... –

+0

Dans ce cas, le problème est avec l'instanciation de contrôle- les contrôles à valider ne sont pas détectables par les validateurs lorsqu'ils sont imbriqués dans le contrôle utilisateur. Une autre raison de ne pas agréger ... –

+0

Après réflexion, je pense qu'inclure le contrôle à valider dans le contrôle utilisateur est la meilleure solution; même s'il est possible de faire ce que je voulais, ça ne serait pas payant. –

1

Je crois qu'ASP.NET s'attend à ce que l'ID ControlToValidate soit dans le même conteneur d'attribution de noms. Vous pouvez probablement remplacer la méthode de validation et utiliser Parent.FindControl.

EDIT: Cela peut être un bon endroit pour utiliser un CompositeControl plutôt qu'un UserControl. Ils sont conçus pour ce type d'agrégation. Mais vous pourriez avoir un problème similaire NamingContainer.

+0

Merci pour la suggestion CompositeControl! Je pense, de toute façon, que je vais aller à la solution la plus simple. –

Questions connexes