2012-04-16 12 views
8

Ich habe eine CustomValidator auf mein Formular gesetzt. Ich habe seine ControlToValidate Eigenschaft nicht festgelegt. In seiner ServerValidate Veranstaltung habe ich folgendes geschrieben:CustomValidator ServerValidate Methode feuert nicht

protected void CustomValidator1_ServerValidate(object source,  
               ServerValidateEventArgs args) 
{ 
    args.IsValid = false; 
} 

habe ich einen Haltepunkt zu dieser Methode, aber es scheint nie zu diesem Punkt zu kommen. Aber wenn ich das auf einer anderen Form mache, wirkt es wie ein Zauber.

  1. Die ValidationGroup Eigenschaft sowohl die Taste und die CustomValidator sind die gleichen
  2. ich diese Eigenschaft versucht, sowohl in der Schaltfläche Löschen und die CustomValidator, immer noch nicht funktioniert.

Es scheint, als gäbe es etwas Formwide. Ich habe einfach eine CustomValidator auf das Formular und berühren Sie keine seiner Eigenschaften, außer nur seine ServerValidate Ereignismethode einstellen.

EDIT: Hier ist der aspx Teil:

<asp:CustomValidator ID="CustomValidator2" runat="server" 
     ErrorMessage="This is a test" 
    onservervalidate="CustomValidator1_ServerValidate" 
    ValidationGroup="PA"></asp:CustomValidator> 


<asp:Button ID="btnPensionersOK" runat="server" Text="OK" Width="75px" 
      onclick="Button1_Click" ValidationGroup="PA" /> 

Antwort

19

Versuchen Sie, die Validierung in den Button-Click-Handler über Page.Validate zu erzwingen:

protected void Button1_Click(Object sender, EventArgs e) 
{ 
    Page.Validate(); 
    if(Page.IsValid) 
    { 
     // servervalidate should have been called 
    } 
} 

bearbeiten (aus den Kommentaren):

Wenn Sie möchten, dass der customvalidator überprüft, ob in Ihren Steuerelementen nichts eingegeben/ausgewählt wurde, müssen Sieeinstellenzu wahr. Sie können auch die CustomValidator die RequiredFieldValidators ersetzen lassen.

Ich gehe davon aus, dass die Validator-Reihenfolge auf dem aspx entscheidet, ob ein severvalidate eines Custom Validators aufgerufen wird, wenn ein vorheriger Validator bereits Page.IsValid=false gemacht hat. Oder ASP.NET ist so intelligent, dass es die SeverValidate als kostspieliger als eine einfache Text-leer-Prüfung annimmt.

+0

Aber wie funktionieren andere Validatoren? Ich habe mehrere RequiredFieldValidator auf demselben Formular, aber sie funktionieren normal. Und wieder mache ich genau dasselbe auf einem anderen Formular, und es gibt kein Problem, es bestätigt. Die Dinge sind ServerValidate Methode feuert nicht. –

+1

@MikeJM: Ich weiß es nicht. Sind Sie in page_load für Postbacks verantwortlich? Rufst du woanders 'Page.Validate()'? Erhalten Sie Javascriptfehler? Verhindern die RequiredFieldValidators das Postback? Gibt es überhaupt zurück? –

+0

Ja, ich bette mich in page_load, aber nicht in PostBack. Ich rufe nie Page.validate() irgendwo sonst. Ich bekomme keine Javascript-Fehler. Die RequiredFieldValidators verhindern Postback. Es wird zurück geschrieben. –

0

Ich möchte auch etwas mehr Hilfe für diejenigen, die CustomValidators und RequiredFieldValidators zur gleichen Zeit verwenden. Man sollte berücksichtigen, dass die Validierung der Client-Seite zuerst stattfindet. Und die serverseitige Validierung findet erst nach PostBack statt. Ich bin mir sicher, dass Sie es verstanden haben, nur für den Fall, dass dies nicht ganz klar ist: Es bedeutet zunächst, dass alle Steuerelemente, die an bestimmte clientseitige Arbeitsvalidatoren gebunden sind, gültig sein müssen, damit Postback auftreten kann. Nach der Seite. IsValid ist True Server Side Stuff und gibt alle Änderungen zurück, die serverseitige Validierungsnachrichten enthalten.

sind also hier die Möglichkeiten, eine in Validatoren beide CustomVCalidators und andere gebaut machen .:

  1. Stellen Sie beide Gruppen von Validatoren zur gleichen Zeit arbeiten auf Client-Seite zu arbeiten. In diesem Fall müssen wir sicherstellen, dass wir für das/die benutzerdefinierte (n) Valitor (s) das Skript, das die Validierung auf der Clientseite durchführt, spacifizieren werden. Ohne Skript zu schreiben und nur die ServerValidate-Methode auszufüllen, wird die Validierung im Server stattfinden. Selbst wenn die EnableClientScript-Eigenschaft auf True gesetzt ist.

  2. Legen Sie fest, dass beide Gruppen von Validatoren serverseitig arbeiten. Setzen Sie EnableClientScript einfach auf False. Beachten Sie jedoch, dass dadurch der Server geladen wird.