2010-09-03 10 views
16

Diciamo che ho questo codice.Come ottenere la proprietà 'controlToValidate' su ClientValidationFunction?

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

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

E un validationFunction:

function ValidationFunction1(sender, args) 
{ 
} 

E vorrei sapere se, all'interno della funzione ho potuto ottenere il controllo per convalidare qualcosa di simile:

var v = sender.ControlToValidate; 

risposta

26

In realtà sender.controltovalidate dà il ClientID del controllo. Quindi questa sembra una soluzione.

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

ho provato e ha funzionato per me. Si prega di avvisare se funziona.

+0

Ciao Musa. Ho provato a farlo ma restituisce 'indefinito' – DJPB

+2

È davvero interessante perché l'ho provato in IE e Chrome, entrambi hanno funzionato bene nel mio sito Web .NET 3.5. Assicurati di avere il sender.controltovalidate in lettere minuscole perché anch'io ho undefined con ControlloValutato pascalizzato. –

+1

Sì, l'ho provato come te ma non ha ancora successo. Quali proprietà hai impostato quando dichiari il tag del validatore personalizzato? – DJPB

1

Non verificato, solo un suggerimento:

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

, naturalmente, si potrebbe semplicemente fare così:

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

se si sa esattamente cosa si sta convalidare. Il primo metodo è buono quando il controllo da convalidare è impostato dinamicamente e non si sa in anticipo quale sarà.

Anche FindControl() potrebbe restituire null quindi è necessario testarlo anche per evitare un'eccezione.

Spero che questo aiuti.

+0

+1. Mi stavi leggendo nella mente. – Steven

0

Ecco il mio prendere su una soluzione server-side in C# per simulare la risposta di cui sopra, per chiunque sia interessato:

<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> 

E sul 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; 
    } 

Queste due linee sono il punto cruciale di esso.

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

Il NamingContainer sarà un GridViewRow nel mio caso, ma potrebbe essere la vostra intera pagina a seconda del programma. In ogni caso mi permette di trovare il controllo che voglio, relativamente all'oggetto ControlToValidate, che come detto restituirà l'ID cliente.

Problemi correlati