2012-10-16 1 views
1

Je suis nouveau à la validation et j'ai mis en caisse un simple formulaire Web que j'essaie de valider, où je remplace la méthode EvaluateIsValid() de la classe BaseValidator dans le dossier App_Code. Dans cette méthode, j'obtiens l'erreur L'objet n'est pas défini sur une instance d'un objet lors de l'appel this.GetControlValidationValue() pour définir la chaîne.L'objet de validation personnalisée n'est pas défini sur une instance

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ValidApp.Default" %> 

<!DOCTYPE html> 

<script runat="server"> 
    protected void pageCvd_ServerValidate(object source, ServerValidateEventArgs args) 
    { 
     ValidApp.App_Code._Validators valid = new ValidApp.App_Code._Validators(usernameTxt.ClientID.ToString()); 
    } 
</script> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div style="display:inline-block; width:200px;"> 
     <asp:CustomValidator ID="pageValidatorCvd" runat="server" EnableClientScript="false" OnServerValidate="pageCvd_ServerValidate"></asp:CustomValidator>  
     <asp:Label ID="usernameLbl" runat="server" Text="Username:" style="width:50px; font-size:xx-small"></asp:Label> 
     <asp:TextBox ID="usernameTxt" runat="server" style="width:100px; font-size:xx-small"></asp:TextBox> 
     <br /> 
     <asp:Label ID="passwordLbl" runat="server" Text="Password:" style="width:50px; font-size:xx-small"></asp:Label> 
     <asp:TextBox ID="passwordTxt" runat="server" style="width:100px; font-size:xx-small"></asp:TextBox> 
    </div> 
    <div> 
     <asp:Button ID="registryBtn" runat="server" OnCommand="registryBtn_Command" CommandName="" CommandArgument="" Text="Register" style="width:50px; font-size:xx-small"/> 
    </div> 
    </form> 
</body> 
</html> 

code Derrière


namespace ValidApp.App_Code 
{ 
    public class _Validators : BaseValidator 
    { 
     private string regex; 
     private string errorMessage; 
     private string controlToValidate; 

     protected override bool EvaluateIsValid() 
     { 
      string value = this.GetControlValidationValue(controlToValidate); 
      return Regex.IsMatch(value, regex); 
     } 

     public _Validators(string controlToValidate = "", string regex = @"^[a-z0-9]{6-8}$", string errorMessage = "The Username is not valid!") 
     { 
      this.regex = regex; 
      this.errorMessage = errorMessage; 
      this.controlToValidate = controlToValidate; 

      bool validation = EvaluateIsValid();    
     } 
    } 
} 

J'ai essayé de créer ma propre validation personnalisée sur <%@ Register > mais en vain.

Des idées où je me trompe?

+0

L'avez-vous débogué pour vous assurer que 'controlToValidate' est réglé sur une valeur appropriée? Je soupçonne que nul n'est transmis à votre constructeur d'une manière ou d'une autre. Je ne pense pas que les webcontrols puissent même avoir des constructeurs paramétrés. – CodingGorilla

+0

Oui, j'ai, il envoie le bon contrôle. C'est le contrôle du validateur personnalisé qu'il ne reçoit pas! – DaNet

Répondre

0

La solution:

Il semble que vous ne pouvez pas faire des appels au constructeur de la classe , cette méthode façon EvaluateIsValid() est frappé sur son propre et obtient le droit de contrôle!

namespace ValidApp.App_Code 
{ 
    public class _Validators : BaseValidator 
    { 
     protected override bool EvaluateIsValid() 
     { 
      string value = this.GetControlValidationValue(ControlToValidate); 
      return Regex.IsMatch(value, @"^[a-z0-9]{6-8}$"); 
     } 

     public _Validators() 
     { 

     } 
    } 
} 

Et c'est tout ce qu'il ya à faire!

Questions connexes