Как получить свойство '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;
4 ответа
На самом деле 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.
Вот мое простое решение, позволяющее получить доступ к элементу управления для проверки на стороне клиента. Добавьте обычный элемент управления Custom Validator с параметрами, которые могут вам понадобиться.
<asp:CustomValidator ID="cvalShippingRegionCountries" ErrorMessage="Choose a country" ClientValidationFunction="ClientValMultiSelectCountries" runat="server" Display="Dynamic" SetFocusOnError="true" />
Затем в коде просто добавьте настраиваемый атрибут для хранения идентификатора клиента элемента управления для проверки.
cvalShippingRegionCountries.Attributes.Add("ControlToValidateClientID", multiselectShippingRegionCountries.ClientID);
Теперь в функции, которая занимается проверкой, вы можете получить доступ к значению следующим образом:
function ClientValMultiSelectCountries(sender, args) {
var multiselect = $find(sender.attributes.controltovalidateclientid.nodeValue);
if ( #VALIDATION_CHECK_HERE# ) {
args.IsValid = false;
}
}
Вы получите clientID внутри своей функции;)