Как получить свойство 'controlToValidate' на ClientValidationFunction?


Допустим, у меня есть этот код.

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

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

И функция проверки:

function ValidationFunction1(sender, args)
{
}

И я хотел бы знать, если бы внутри функции я мог получить контроль для проверки чего-то вроде:

var v = sender.ControlToValidate;
3 16

3 ответа:

Фактически sender.controltovalidate дает ClientID Управления. Так что это похоже на решение.

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

Я попробовал и это сработало для меня. Пожалуйста, сообщите, если это работает.

Не проверено, просто Подсказка:

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

Конечно, вы можете просто сделать это так:

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

Если вы точно знаете, что вы проверяете. Первый метод хорош, когда проверяемый элемент управления устанавливается динамически, и вы заранее не знаете, какой именно он будет.

Также FindControl() может возвращать null, поэтому вам нужно будет проверить и это, чтобы избежать исключения.

Надеюсь, это поможет.

Вот мой взгляд на серверное решение в C#, чтобы имитировать вышеприведенный ответ, для всех заинтересованных:

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

А на сервере:

//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;
    }

Эти две строки суть его.

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

NamingContainer будет GridViewRow в моем случае, но это может быть вся ваша страница в зависимости от вашей программы. В любом случае это позволяет мне найти нужный мне элемент управления относительно объекта ControlToValidate, который, как уже упоминалось, вернет ClientID.