Asp.net Firefox上的CompareValidator问题

Asp.net Firefox上的CompareValidator问题,asp.net,javascript,asp.net-3.5,Asp.net,Javascript,Asp.net 3.5,我需要在web表单应用程序中验证日期。为此,我使用了一个带有 Operator="DataTypeCheck" Type="Date" 问题是这个验证器在2位数年份的Firefox上不能正常工作。(javascript错误:m[2]未定义) 使用4位数的年份,它工作正常 此处也描述了此问题: 有人知道一个很好的解决方法吗 谢谢也许这对你有帮助(上一篇文章,只需要dataType==“Date”),但我还没有测试过: 我的解决方案是创建一个日期验证器,它继承自BaseValidator,并覆盖

我需要在web表单应用程序中验证日期。为此,我使用了一个带有

Operator="DataTypeCheck" Type="Date"
问题是这个验证器在2位数年份的Firefox上不能正常工作。(javascript错误:m[2]未定义) 使用4位数的年份,它工作正常

此处也描述了此问题:

有人知道一个很好的解决方法吗

谢谢

也许这对你有帮助(上一篇文章,只需要dataType==“Date”),但我还没有测试过:

我的解决方案是创建一个日期验证器,它继承自
BaseValidator
,并覆盖
控件属性valid()、EvaluateIsValid()和OnPreRender(EventArgs e)

如果您有其他想法,请停止。

这是ASP.NET 3.5及更早版本的客户端验证脚本中的一个错误。(该脚本在较早版本的Internet Explorer中正常工作,但在符合标准的较新浏览器中不能正常工作。)

Microsoft已修复ASP.NET 4.0中的错误

如果无法升级到ASP.NET 4.0,则可以从.NET 4.0附带的System.Web.dll版本中导出WebUIValidation.js资源,然后在页面的
PreRender
事件中注册脚本:

this.ClientScript.RegisterClientScriptInclude(
    typeof(System.Web.UI.WebControls.BaseValidator), "WebUIValidation.js",
    "url-to-the-4.0-WebUIValidation.js-script");
或者,您可以通过将以下内容添加到页面上的
块来覆盖buggy
ValidatorConvert
函数:

function ValidatorConvert(op, dataType, val) {
    function GetFullYear(year) {
        var twoDigitCutoffYear = val.cutoffyear % 100;
        var cutoffYearCentury = val.cutoffyear - twoDigitCutoffYear;
        return ((year > twoDigitCutoffYear) ? (cutoffYearCentury - 100 + year) : (cutoffYearCentury + year));
    }
    var num, cleanInput, m, exp;
    if (dataType == "Integer") {
        exp = /^\s*[-\+]?\d+\s*$/;
        if (op.match(exp) == null)
            return null;
        num = parseInt(op, 10);
        return (isNaN(num) ? null : num);
    }
    else if(dataType == "Double") {
        exp = new RegExp("^\\s*([-\\+])?(\\d*)\\" + val.decimalchar + "?(\\d*)\\s*$");
        m = op.match(exp);
        if (m == null)
            return null;
        if (m[2].length == 0 && m[3].length == 0)
            return null;
        cleanInput = (m[1] != null ? m[1] : "") + (m[2].length>0 ? m[2] : "0") + (m[3].length>0 ? "." + m[3] : "");
        num = parseFloat(cleanInput);
        return (isNaN(num) ? null : num);
    }
    else if (dataType == "Currency") {
        var hasDigits = (val.digits > 0);
        var beginGroupSize, subsequentGroupSize;
        var groupSizeNum = parseInt(val.groupsize, 10);
        if (!isNaN(groupSizeNum) && groupSizeNum > 0) {
            beginGroupSize = "{1," + groupSizeNum + "}";
            subsequentGroupSize = "{" + groupSizeNum + "}";
        }
        else {
            beginGroupSize = subsequentGroupSize = "+";
        }
        exp = new RegExp("^\\s*([-\\+])?((\\d" + beginGroupSize + "(\\" + val.groupchar + "\\d" + subsequentGroupSize + ")+)|\\d*)"
                        + (hasDigits ? "\\" + val.decimalchar + "?(\\d{0," + val.digits + "})" : "")
                        + "\\s*$");
        m = op.match(exp);
        if (m == null)
            return null;
        if (m[2].length == 0 && hasDigits && m[5].length == 0)
            return null;
        cleanInput = (m[1] != null ? m[1] : "") + m[2].replace(new RegExp("(\\" + val.groupchar + ")", "g"), "") + ((hasDigits && m[5].length > 0) ? "." + m[5] : "");
        num = parseFloat(cleanInput);
        return (isNaN(num) ? null : num);
    }
    else if (dataType == "Date") {
        var yearFirstExp = new RegExp("^\\s*((\\d{4})|(\\d{2}))([-/]|\\. ?)(\\d{1,2})\\4(\\d{1,2})\\.?\\s*$");
        m = op.match(yearFirstExp);
        var day, month, year;
        if (m != null && (((typeof(m[2]) != "undefined") && (m[2].length == 4)) || val.dateorder == "ymd")) {
            day = m[6];
            month = m[5];
            year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
        }
        else {
            if (val.dateorder == "ymd"){
                return null;
            }
            var yearLastExp = new RegExp("^\\s*(\\d{1,2})([-/]|\\. ?)(\\d{1,2})(?:\\s|\\2)((\\d{4})|(\\d{2}))(?:\\s\u0433\\.|\\.)?\\s*$");
            m = op.match(yearLastExp);
            if (m == null) {
                return null;
            }
            if (val.dateorder == "mdy") {
                day = m[3];
                month = m[1];
            }
            else {
                day = m[1];
                month = m[3];
            }
            year = ((typeof(m[5]) != "undefined") && (m[5].length == 4)) ? m[5] : GetFullYear(parseInt(m[6], 10));
        }
        month -= 1;
        var date = new Date(year, month, day);
        if (year < 100) {
            date.setFullYear(year);
        }
        return (typeof(date) == "object" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate()) ? date.valueOf() : null;
    }
    else {
        return op.toString();
    }
}
函数验证程序转换(op、数据类型、val){
函数GetFullYear(年){
var TwoDigitCutofYear=val.CutofYear%100;
var CutofYearCentury=val.CutofYear-TwoDigitCutofYear;
返回((年>两位数截止年)?(截止年世纪-100+年):(截止年世纪+年);
}
var num,cleanInput,m,exp;
如果(数据类型==“整数”){
exp=/^\s*[-\+]?\d+\s*$/;
if(op.match(exp)==null)
返回null;
num=parseInt(op,10);
返回值(isNaN(num)?null:num);
}
else if(数据类型==“Double”){
exp=new RegExp(“^\\s*([-\\+])?(\\d*)\\”+val.decimalchar+”?(\\d*)\\s*$”;
m=运算匹配(exp);
如果(m==null)
返回null;
如果(m[2]。长度==0&&m[3]。长度==0)
返回null;
cleanInput=(m[1]!=null?m[1]:“”)+(m[2]。长度>0?m[2]:“0”)+(m[3]。长度>0?”。“+m[3]:“”);
num=parseFloat(cleanInput);
返回值(isNaN(num)?null:num);
}
else if(数据类型==“货币”){
变量hasdights=(val.digits>0);
变量beginGroupSize,subsequentGroupSize;
var groupSizeNum=parseInt(val.groupsize,10);
如果(!isNaN(groupSizeNum)&&groupSizeNum>0){
beginGroupSize=“{1,”+groupSizeNum+“}”;
subsequentGroupSize=“{”+groupSizeNum+“}”;
}
否则{
beginGroupSize=subsequentGroupSize=“+”;
}
exp=new RegExp(“^\\s*([-\\+])?(\\d“+beginGroupSize+”(\\“+val.groupchar+”\\d“+subsequentGroupSize+”)+)。\\d*)
+(hasDigits?\\“+val.decimalchar+”?(\\d{0,“+val.digits+”})”:“”)
+“\\s*$”;
m=运算匹配(exp);
如果(m==null)
返回null;
如果(m[2]。长度==0&&hasDigits&&m[5]。长度==0)
返回null;
cleanInput=(m[1]!=null?m[1]:“”)+m[2]。替换(新RegExp(“(\\”+val.groupchar+”),“”),+((hasdights&&m[5]。长度>0)?“+m[5]:“”);
num=parseFloat(cleanInput);
返回值(isNaN(num)?null:num);
}
else if(数据类型==“日期”){
var yearFirstExp=new RegExp(“^\\s*(\\d{4})\(\\d{2}))([-/]\\\.?)(\\d{1,2})\\4(\\d{1,2})\.?\\s*”;
m=操作匹配(yearFirstExp);
var日、月、年;
如果(m!=null&((typeof(m[2])!=“undefined”)&&(m[2].length==4))| | val.dateorder==“ymd”)){
日=m[6];
月=m[5];
year=(m[2]。length==4)?m[2]:GetFullYear(parseInt(m[3],10));
}
否则{
如果(val.dateorder==“ymd”){
返回null;
}
var yearLastExp=new RegExp(“^\\s*(\\d{1,2})([-/]\\\?)(\\d{1,2})(?:\\s}\\2)((\\d{4})(\\d{2}))(?:\\s\u0433\\.\124\\)?\\ s*”;
m=操作匹配(yearLastExp);
如果(m==null){
返回null;
}
如果(val.dateorder==“mdy”){
日=m[3];
月=m[1];
}
否则{
日=m[1];
月=m[3];
}
年份=((typeof(m[5])!=“undefined”)&(m[5]。长度==4))?m[5]:GetFullYear(parseInt(m[6],10));
}
月份-=1;
var日期=新日期(年、月、日);
如果(年份<100){
日期:整年(年);
}
返回(typeof(date)=“object”&&year==date.getFullYear()&&month==date.getMonth()&&day==date.getDate())?date.valueOf():null;
}
否则{
返回操作toString();
}
}
使用自定义验证器

Imports System.Globalization

  Private Sub CustomValidator1_ServerValidate(source As Object, args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles CustomValidator1.ServerValidate
    Dim dateResult As Date
    If Date.TryParse(TextBox1.Text, CultureInfo.CreateSpecificCulture("zh-CN"), DateTimeStyles.None, dateResult) Then
        args.IsValid = True
    Else
        args.IsValid = False
    End If
End Sub

如果愿意的话,可以在JS的客户端上做相同的操作。

Hi Tim谢谢你的提示。在指定的线程中,Rachel建议将CustomValidator与ComparedValidator中的固定java脚本代码一起使用。我更喜欢创建一个新的验证器,因为我可以通过代码轻松地重用它。我不明白你为什么不把你的解决方案发布到你自己的问题上。。。我正在使用ASP.NET 4.0和ie9或更高版本,输入两位数的日期时仍然会出现JS错误。我很惊讶没有更多关于它的帖子。@pghcpa:看看浏览器开发工具中的验证脚本。您是否在
ValidatorConvert
函数中看到对
“未定义”
的引用?