2009-08-25 9 views
0

Je rencontre des problèmes lors de l'utilisation d'un validateur d'expressions régulières ASP.NET dans les zones de texte. Ceci est une version condensée de mon code:Expression régulière Validate() renvoie NullReference (ASP.NET)

RegularExpressionValidator regex = new RegularExpressionValidator(); 
regex.ID = "TextBoxRegExValidator" +  ((AVPEditControl)avpControl).ThisFieldRID.ToString(); //random name 
regex.ControlToValidate = ((AVPEditControl)avpControl).TextControlID; //this is valid. 
regex.ValidationExpression = "\d{3}-\d{2}-\d{4}"; 
regex.Text = "epic fail"; 
//later, in an event handler 
regex.Display = ValidatorDisplay.None; 
regex.ErrorMessage = ""; 
regex.Validate(); //ERROR 
bool valid = AVPEdit.Validator.IsValid; 

Là où je marqué « erreur » est là où je reçois un NullReferenceException jeté. Je ne vois pas ce qui me manque ici, car j'ai confirmé avec un débogueur que regex n'est pas nulle dans ce contexte, et que le contrôle n'est pas non plus valide.

Je souhaite avoir un contrôle plus fin sur la façon dont le message d'erreur est affiché, c'est pourquoi j'ai choisi de ne pas relier regex dans des panneaux ou autres.

Pourquoi devrais-je obtenir une référence nulle à partir de cela? (Est-ce un bug dans .NET?)

Notez également que cela fonctionne lorsque je mets Visible à 0, mais cela fait que IsValid est toujours vrai.

Répondre

2

Tous les valideurs ASP.NET doivent faire partie d'une page pour fonctionner. Vous remarquerez que la méthode Validate ne renvoie pas de valeur; C'est parce qu'il n'est pas destiné à être utilisé comme vous l'utilisez. A l'intérieur de la méthode Validate, il tente de rechercher le contrôle par son ID et sans conteneur de nommage parent, il n'a aucune possibilité de le faire. La façon dont vous le faites, il n'a aucune valeur à valider contre (car il ne sera pas en mesure de trouver le contrôle).

je ferais une des opérations suivantes:

1) Mettre le validateur dans le ASPX, puis utilisez la méthode Valider et vérifier la propriété IsValid après. Réglez simplement Display sur None et il ne devrait pas apparaître dans votre interface utilisateur.

2) Exécutez simplement la regex manuellement. Vous écrivez beaucoup plus de code ici que ce qui serait nécessaire si vous utilisiez simplement Regex.IsMatch.

(Notez que si vous utilisez réflecteur, recherchez RegularExpressionValidator, vous verrez où il tentera d'appeler à this.NamingContainer entre autres qui seraient nuls sans faire partie d'une collection de contrôle)

+0

Je l'ai changé pour utiliser simplement Regex. Je n'ai pas réalisé que C# avait autre chose que les bases nues de regex .. – Earlz

1

Je pense que vous devriez l'ajouter à votre collection de contrôles, peut-être à l'intérieur d'un contrôle div invisible pour le faire fonctionner.

Mais si vous voulez valider votre zone de texte par programme, pourquoi ne pas simplement écrire une méthode qui utilise votre modèle pour valider le contrôle et renvoyer la validité?

+0

Bon point, je devrais probablement. Mais la page entière est créée dynamiquement. Je ne peux pas simplement le mettre dans un div, le contrôle doit être créé et ajouté dynamiquement à la page. J'ai essayé de créer un Panel (non attaché à une page) et d'y ajouter le validateur, mais cela n'a rien fait. – Earlz

0

Je pense que si vous voulez utiliser le code derrière pour la validation, vous pouvez utiliser quelque chose comme ça

Match m = Regex.Match(yourtext,"\d{3}-\d{2}-\d{4}") 

if(m.Success) 
{ 
//valid 
} 

else 
{ 
//invalid 
}