控制自定义验证程序.NET客户端验证中的名称

时间:2010-02-09 07:27:49

标签: c# .net javascript validation customvalidator

我有一个包含三列文本框的gridview。它可以根据需要包含多行,但通常只有大约5行。每行都需要验证。

我想创建一个客户端验证器,将两个列合并在一起,并将其与第三列进行比较,以检查用户是否正确输入了数据。

万一你想知道,这是规范的一部分,运营商必须进入第三列,而不是简单地将后两个列汇总在后面的代码中。这样做是为了确保操作员正确地转录信息。

我正在尝试使用.net中的自定义验证程序来创建此客户端验证。但我找不到一种方法来传递三个文本框的名称。 我可以使用ControlToValidate参数给它目标控件名称,但是如何传入另外两个控件ID呢?

我正在寻找'正确'的方法来做到这一点,一个想法是在controltovalidate的名称引用的javascript中创建一个数组。

DC

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。不是一个优雅的解决方案,但它有效。

首先我将代码放入页面上的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# )。

DC