2010-06-11 4 views
4

웹 양식 응용 프로그램에서 날짜의 유효성을 검사해야합니다. 이를 위해 CompareValidator를 사용합니다.Firefox의 CompareValidator 문제

Operator="DataTypeCheck" Type="Date" 

문제는이 Validator가 2 자리 연도의 Firefox에서 제대로 작동하지 않습니다. (자바 스크립트 오류 : m [2]가 정의되지 않았습니다.) 4 자리 숫자로 올바르게 작동합니다.

이 문제는 여기에 설명되어 있습니다 : https://connect.microsoft.com/VisualStudio/feedback/details/355573/comparevalidator-client-side-bug-two-digit-year-in-mozilla-based-browsers-throws-js-exception

사람이 이것에 대한 좋은 해결 방법을 알고 있나요?

감사

답변

0

내 솔루션에서 상속 날짜 유효성 검사기를 만드는 것이 었습니다 BaseValidator을 입력하고 ControlPropertiesValid(), EvaluateIsValid() and OnPreRender(EventArgs e)을 덮어 씁니다. 다른 아이디어가 있으면 촬영하십시오.

+0

당신의 솔루션에 자신의 질문을 게시하는 것이 왜 이해가 안되나요? 공유하는 것이 중요합니다. – danyim

1

는 아마도이 당신을 도와은 (마지막 게시물 만 데이터 형식 == "날짜"필요),하지만 난 그것을 테스트 havent 한 : http://forums.asp.net/t/1358621.aspx

+0

안녕하세요, 귀하의 힌트에 감사드립니다. 스레드에서 Rachel이 ComparedValidator의 고정 자바 스크립트 코드로 CustomValidator를 사용하도록 제안했습니다. 코드를 통해 쉽게 다시 사용할 수 있으므로 새 유효성 검사기를 만드는 것이 좋습니다. – Costin

2

이것은 클라이언트 측 유효성 검사 스크립트에서 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"); 

또는, 당신은 당신의 페이지에 <script type="text/javascript"> 블록에 다음을 추가하여 버그 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(); 
    } 
} 
+0

ie9 이상의 ASP.NET 4.0을 사용 중이며 두 자리 날짜를 입력 할 때 여전히 JS 오류가 발생합니다. 나는 그것에 더 많은 게시물이 없다는 것에 놀랐다. – pghcpa

+0

@pghcpa : 브라우저의 개발자 도구에서 유효성 검사 스크립트를보십시오. 'ValidatorConvert' 함수에서''undefined ''에 대한 참조를 보았습니까? –

0

사용자 지정 유효성 검사기를 사용

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와 동일한 기능을 수행 할 수 있습니다.