【问题标题】:control names in a custom validator .NET Client Side Validation自定义验证器中的控件名称 .NET 客户端验证
【发布时间】:2011-01-14 16:59:27
【问题描述】:

我有一个带有三列文本框的网格视图。它可以有尽可能多的行,但通常只有大约 5 行。每一行都需要验证。

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

如果您想知道,规范的一部分是操作员必须输入第三列,而不是在后面的代码中简单地将前两列相加。这样做是为了确保操作员正确转录信息。

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

我正在寻找执行此操作的“正确”方法,一种想法是在 javascript 中创建一个由 controltovalidate 名称引用的数组。

直流

【问题讨论】:

    标签: c# .net javascript validation customvalidator


    【解决方案1】:

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

    首先我把代码放到页面的一个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# )。

    直流

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-19
      • 2014-03-19
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 2015-03-26
      相关资源
      最近更新 更多