2010-06-11 64 views
4

我需要在Web窗體應用程序中驗證日期。爲此,我使用了一個CompareValidator與Firefox上的CompareValidator問題

Operator="DataTypeCheck" Type="Date" 

問題是這個驗證器無法在2位數字的Firefox上正常工作。 (javascript錯誤:米[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 2012-09-25 13:55:43

1

也許這可以幫助你(過去後,僅datatype ==「日期」需要),但我還沒有測試它: http://forums.asp.net/t/1358621.aspx

+0

嗨蒂姆謝謝你的提示。在您指定Rachel建議使用CustomValidator和來自ComparisonValidator的固定java腳本代碼的線程中。我更喜歡創建一個新的驗證器,因爲我可以通過代碼輕鬆地重用它。 – Costin 2010-06-14 07:48:45

2

這是ASP.NET 3.5及更早版本中客戶端驗證腳本中的一個錯誤。 (該腳本在較舊版本的Internet Explorer中正常工作,但在較新的符合標準的瀏覽器中無法正常工作。)

Microsoft已修復ASP.NET 4.0中的錯誤。

如果您不能升級到ASP.NET 4.0,您可以導出從System.Web.dll的版本中自帶的.NET 4.0的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

我使用ie8或更高版本的ASP.NET 4.0,輸入兩位數日期時仍然出現JS錯誤。我很驚訝沒有更多的帖子。 – pghcpa 2014-04-15 23:58:04

+0

@pghcpa:查看瀏覽器開發人員工具中的驗證腳本。你在'ValidatorConvert'函數中看到對''undefined''的引用嗎? – 2014-04-16 13:46:18

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的客戶端執行等價操作。