2010-09-03 4 views
16

Sagen wir, ich habe diesen Code.Wie erhält man die 'controlToValidate'-Eigenschaft in ClientValidationFunction?

<asp:TextBox ID="TextBox1" runat="server" /> 

<asp:CustomValidator ID="CustomValidator1" runat="server" 
    ClientValidationFunction="ValidationFunction1" 
    ControlToValidate="TextBox1" 
    Display="Dynamic" /> 

Und ein validationFunction:

function ValidationFunction1(sender, args) 
{ 
} 

Und ich würde, wenn wissen wollen, innerhalb der Funktion konnte ich die Kontrolle bekommen so etwas wie zu überprüfen:

var v = sender.ControlToValidate; 

Antwort

26

Eigentlich sender.controltovalidate gibt die ClientID der Kontrolle. Das scheint also eine Lösung zu sein.

function ValidationFunction1(sender, args){ 
    var v = document.getElementById(sender.controltovalidate); 
} 

Ich versuchte und es funktionierte für mich. Bitte benachrichtigen, wenn es funktioniert.

+0

Hallo Musa. Ich habe versucht, das zu tun, aber es ist 'undefined' – DJPB

+2

Es ist wirklich interessant, weil ich es in IE und Chrome versucht habe, beide funktionierte gut in meiner .NET 3.5 Website. Bitte stellen Sie sicher, dass Sie die Absender-Kontrolle haben, um Kleinschreibung zu validieren, weil ich auch undefined mit Pascalcased ControlToValidate wurde. –

+1

Ja, versuchte es einfach wie du, aber immer noch keinen Erfolg. Welche Eigenschaften haben Sie beim Deklarieren des benutzerdefinierten Validator-Tags festgelegt? – DJPB

1

nicht überprüft, nur ein Hinweis:

var v = document.getElementById('<%=CustomValidator1.FindControl(CustomValidator1.ControlToValidate).ClientID>%'); 

natürlich könnten Sie einfach tun, wie:

var v = document.getElementById('<%=TextBox1.ClientID%>'); 

wenn Sie genau wissen, was Sie validieren. Die erste Methode ist gut, wenn das zu validierende Steuerelement dynamisch festgelegt wird und Sie nicht im Voraus wissen, welches Steuerelement es sein wird.

Auch FindControl() könnte null zurückgeben, also müssten Sie auch dafür testen, um eine Ausnahme zu vermeiden.

Hoffe, das hilft.

+0

+1. Du hast meine Gedanken gelesen. – Steven

0

Hier ist mein nehmen auf einer serverseitigen Lösung in C#, um die oben genannte Antwort zu imitieren, für alle Interessierten:

<asp:TextBox ID="txtStudentComments" runat="server" 
    Rows="8" Width="100%" 
    ToolbarCanCollapse="False" ValidationGroup="vg1" /> 
<asp:CustomValidator ID="cv1" runat="server" ControlToValidate="txtStudentComments" 
ErrorMessage="THESE COMMENTS DO NOT SEEM RIGHT. PLEASE REVIEW THEM AGAIN!" SetFocusOnError="true" 
Font-Bold="True" Font-Size="Medium" ValidationGroup="vg1" OnServerValidate="cv1_ServerValidate"></asp:CustomValidator> 

Und auf dem Server:

//validate of the comment contains some specific words which imply the TET has not reviewed the comments! 
    protected void cv1_ServerValidate(object source, ServerValidateEventArgs args) 
    { 
     CustomValidator cv = (CustomValidator)source; 
     GridViewRow gvRow = (GridViewRow)cv.NamingContainer; 
     TextBox editor = (TextBox)gvRow.FindControl("txtStudentComments"); 

     if (editor.Text.ToUpper().Contains("FACILITATOR TO INSERT COMMENTS HERE PLEASE")) 
      args.IsValid = false; 
     else 
      args.IsValid = true; 
    } 

Diese beiden Linien sind die Crux davon.

CustomValidator cv = (CustomValidator)source; 
    GridViewRow gvRow = (GridViewRow)cv.NamingContainer; 

Die NamingContainer werden ein GridViewRow in meinem Fall sein, aber es könnte Ihre gesamte Seite auf Ihrem Programm abhängig sein. So oder so kann ich das gewünschte Steuerelement relativ zum ControlToValidate-Objekt finden, das wie erwähnt die ClientID zurückgibt.