2010-06-11 5 views
4

Je dois valider une date dans une application de formulaires Web. Pour cela, j'utilise un CompareValidator avecCompareValidator problème sur Firefox

Operator="DataTypeCheck" Type="Date" 

Le problème est que ce validateur ne fonctionne pas correctement sur Firefox avec 2 ans de chiffres. (erreur javascript: m [2] est indéfini) Avec une année de 4 chiffres, cela fonctionne correctement.

Ce problème est également décrit ici: https://connect.microsoft.com/VisualStudio/feedback/details/355573/comparevalidator-client-side-bug-two-digit-year-in-mozilla-based-browsers-throws-js-exception

Est-ce que quelqu'un connait un palliatif pour cela?

Merci

Répondre

0

Ma solution a été de créer une date validateur qui hérite de BaseValidator et remplace le ControlPropertiesValid(), EvaluateIsValid() and OnPreRender(EventArgs e). Si vous avez d'autres idées s'il vous plaît tiré.

+0

Je ne comprends pas pourquoi ne postez-vous pas votre solution à votre propre question ... Il est utile de partager. – danyim

1

Peut-être que cela vous aide (dernier message, seul dataType == "Date" nécessaire), mais je havent ont testé: http://forums.asp.net/t/1358621.aspx

+0

Salut Tim merci pour votre indice. Dans le thread que vous avez spécifié, Rachel a suggéré d'utiliser un CustomValidator avec un code java-script fixe de ComparedValidator. J'ai préféré créer un nouveau validateur car je peux facilement le réutiliser via le code. – Costin

2

Il s'agit d'un bogue dans ASP.NET 3.5 et versions antérieures, dans le script de validation côté client. (Le script fonctionne correctement dans les anciennes versions d'Internet Explorer mais pas dans les navigateurs conformes aux normes les plus récents.)

Microsoft a résolu le problème dans ASP.NET 4.0.

Si vous ne pouvez pas mettre à niveau vers ASP.NET 4.0, vous pouvez exporter la ressource WebUIValidation.js de la version de System.Web.dll qui vient avec .NET 4.0, puis enregistrez le script dans l'événement PreRender de votre page:

this.ClientScript.RegisterClientScriptInclude(
    typeof(System.Web.UI.WebControls.BaseValidator), "WebUIValidation.js", 
    "url-to-the-4.0-WebUIValidation.js-script"); 

Alternativement, vous pouvez remplacer la fonction voiturette ValidatorConvert en ajoutant ce qui suit à un bloc <script type="text/javascript"> sur votre page:

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

J'utilise ASP.NET 4.0 avec ie9 ou version ultérieure et je reçois toujours l'erreur JS lors de la saisie de dates à deux chiffres. Je suis surpris qu'il n'y ait pas plus de messages à ce sujet. – pghcpa

+0

@pghcpa: Regardez le script de validation dans les outils de développement de votre navigateur. Voyez-vous des références à '" undefined "' dans la fonction 'ValidatorConvert'? –

0

Utilisez un validateur personnalisé

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 

Pourrait faire l'équivalent avec sur le client dans JS si préféré.