2010-02-09 144 views
0

我有一个包含三列文本框的gridview。它可以有任意数量的行,但通常只有大约5行。每一行都需要验证。控制自定义验证程序中的名称.NET客户端验证

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

为了防万一你想知道,它是规范的一部分,操作员必须输入第三列,而不是简单地将前两列一起总结在代码后面。这样做是为了确保操作员正确地转录信息。

我想在.net中使用自定义验证程序来创建此客户端验证。但我无法找到一种方法将三个文本框的名称传递给它。 我可以使用ControlToValidate参数为其指定目标控件名称,但是如何传递其他两个控件ID?

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

DC

回答

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函数保持了原始邮件的副本可以以其原始形式进行检索,其他方式我们首次编辑消息时会覆盖占位符(#总共#)。

DC

相关问题