![](/img/trans.png)
[英]ASP.NET Custom Validator Client side & Server Side validation not firing
[英]control names in a custom validator .NET Client Side Validation
我有一个包含三列文本框的gridview。 它可以根据需要具有任意多的行,但通常只有大约5行。 每行都需要验证。
我想创建一个客户端验证器,将两个列加起来,并将其与第三列进行比较,以检查用户是否正确输入了数据。
万一您想知道,这是规范的一部分,操作员必须输入第三列,而不是在后面的代码中简单地将前两列相加。 这样做是为了确保操作员正确地转录信息。
我正在尝试使用.net中的自定义验证器来创建此客户端验证。 但是我找不到将三个文本框的名称传递给它的方法。 我可以使用ControlToValidate参数为其指定目标控件名称,但是如何传递其他两个控件ID?
我正在寻找执行此操作的“正确”方法,一种想法是在javascript中创建由controltovalidate名称引用的数组。
直流电
我解决了问题。 不是一个优雅的解决方案,但它可行。
首先,我将代码放入页面上的div中
<div align="right"><asp:CustomValidator ID="RowValidator" runat="server"
ErrorMessage="Total of #total# does not equal 1st Preference + Ticket"
ControlToValidate="Total" ValidateEmptyText="True"
ClientValidationFunction="CheckRow" SetFocusOnError="True" EnableClientScript="True"
enableViewState="False" Display="Dynamic"></asp:CustomValidator></div>
然后我创建了一个JavaScript函数...
function CheckRow(sender,args) {
// get the name of the control to validate
try {
args.IsValid = true;
ctv = sender.controltovalidate;
// get the data from the other controls
nt = document.getElementById(ctv.replace('_Total','_NonTicket'));
t = document.getElementById(ctv.replace('_Total','_Ticket'));
if (nt && t) {
v1 = Number(nt.value);
v2 = Number(t.value);
v3 = Number(args.Value);
if ((v1 + v2) != v3){
msg = GetMessage(sender);
sender.innerHTML = msg.replace("#total#",Number(args.Value));
args.IsValid = false;
return false;
}
}
}
catch (e) {
// something wrong default to server side validation
}
return true;
}
自定义验证器针对每一行调用此方法,我使用发送方的controltovalidate参数获取名称
那么只需进行一些字符串操作即可获取其他字段的名称。
一旦检索到,您就可以做自己喜欢的事情,在我的情况下,我添加并比较。 如果有错误,则清除Isvalid标志,并修改消息以适合。
需要getmessage函数,因为我更改了消息以给出更有意义的错误消息
/*
get the error message from the validator
store it so it can be retrieved again
this is done because the message is altered
*/
function GetMessage(sender){
msg = window[sender.id+"_msg"];
if (!msg){
msg = sender.innerHTML;
window[sender.id+"_msg"] = msg;
}
return msg;
}
getmessage函数保留原始消息的副本,因此,如果用户多次出错,则可以原始格式检索到消息,否则,第一次编辑消息时,我们将覆盖占位符(#total#)。
直流电
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.