2010-04-26 17 views
6

Ho accanto una casella di testo e un datario e sto usando asp.net e l'utente può inserire la data e selezionare la data da datepicker.Jquery datepicker: data di conferma mm/gg/aaaa

Come si convaliderà se la data inserita è corretta?

<script type="text/javascript"> 
     $(document).ready(function() { 
      $('#<%=StartDate.ClientID%>').datepicker({ showOn: 'button', 
        buttonImage: '../images/Calendar.png', 
        buttonImageOnly: true, onSelect: function() { }, 
        onClose: function() { $(this).focus(); } 
      }); 
     }); 
    </script> 
+1

Dipende da quale è la tua definizione di data corretta? –

+1

ad es. 30/30/2008 è una data NON valida. –

risposta

4

Se si utilizza ASP.NET, è possibile utilizzare un ASP.NET Confronta Validator [ASP.NET Date Validator].

<asp:TextBox ID="tb" runat="server"></asp:TextBox> 

<asp:CompareValidator ID="cv" runat="server" 
ControlToValidate="tb" ErrorMessage="* Please enter a valid date!" Text="*" 
Operator="DataTypeCheck" Type="Date"></asp:CompareValidator> 

**** Aggiornamento **

ho preso il javascript che è stato eseguito dal Confronta Validator sopra e avvolto un metodo di jQuery convalida personalizzato intorno ad esso:

<script type="text/javascript"> 
    $(document).ready(function() { 

     $.validator.addMethod("truedate", function (value, element, params) { 
      function GetFullYear(year, params) { 
       var twoDigitCutoffYear = params.cutoffyear % 100; 
       var cutoffYearCentury = params.cutoffyear - twoDigitCutoffYear; 
       return ((year > twoDigitCutoffYear) ? (cutoffYearCentury - 100 + year) : (cutoffYearCentury + year)); 
      } 

      var yearFirstExp = new RegExp("^\\s*((\\d{4})|(\\d{2}))([-/]|\\. ?)(\\d{1,2})\\4(\\d{1,2})\\.?\\s*$"); 
      try { 
       m = value.match(yearFirstExp); 
       var day, month, year; 
       if (m != null && (m[2].length == 4 || params.dateorder == "ymd")) { 
        day = m[6]; 
        month = m[5]; 
        year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10)); 
       } 
       else { 
        if (params.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 = value.match(yearLastExp); 
        if (m == null) { 
         return null; 
        } 
        if (params.dateorder == "mdy") { 
         day = m[3]; 
         month = m[1]; 
        } 
        else { 
         day = m[1]; 
         month = m[3]; 
        } 
        year = (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; 
      } 
      catch (err) { 
       return null; 
      } 
     }, "Please enter an actual date."); 

     $("#form1").validate(); 

     $("#one").rules('add', 
     { 
      truedate: { 
       cutoffyear: '2029', 
       dateorder: 'mdy' 
      } 
     }); 
    }); 

</script> 

<input id="one" /> 
+0

so di avere l'opzione per usare il controllo asp.net ma volevo provare ad usare la convalida jquery. –

+0

ho scattato la javascript prodotta dal comparatore di confronto e ho avvolto un metodo personalizzato attorno ad esso – dochoffiday

+0

potresti anche usare 'remote' e sul server provare a convertirlo in una data che funzionerà anche solo se è una data valida – dochoffiday

0

Dal momento che sei già utilizzando jquery, è possibile controllare http://bassistance.de/jquery-plugins/jquery-plugin-validation/ che ha una grande flessibilità per le convalide ..

+0

sto utilizzando bassistance.de per la convalida del mio modulo ma non trovo alcun esempio per data di convalida, se trovi per favore reindirizza me. –

+1

ha una convalida della data, ma controlla solo il formato della stringa, quindi "30/30/2008" sarebbe una data valida – dochoffiday

+0

@Doc: quindi non esiste un modo reale per controllare la data? o vengo lasciato solo con l'opzione di usare i controlli di validazione asp.net? –

33

Io uso questo gestore per l'input di validazione:

onClose: function(dateText, inst) { 
     try { 
      $.datepicker.parseDate('dd/mm/yy', dateText); 
     } catch (e) { 
      alert(e); 
     }; 

Speranza, sarà utile per qualcuno

+1

Una risposta così perfetta con così poca fanfara! –

4

sto usando un mix di approccio di Katrin & Doc Holiday, utilizzando il metodo di utilità parsedate del controllo DatePicker in un validatore personalizzato ho chiamato IsDate.

Basta modificare l'argomento del formato in parseDate sul valore appropriato (riferimento: http://docs.jquery.com/UI/Datepicker/parseDate).

$(document).ready(function() 
    { 
     $.validator.addMethod('isDate', function(value, element) 
     { 
      var isDate = false; 
      try 
      { 
       $.datepicker.parseDate('dd/mm/yy', value); 
       isDate = true; 
      } 
      catch (e) 
      { 

      } 
      return isDate; 
     }); 

     $("#form1").validate(); 

     $("#dateToValidate").rules("add", { isDate: true, messages: {isDate: "Date to Validate is invalid."} }); 
    }); 

Probabilmente non è delle migliori pratiche per il validatore da riferimento a un controllo dell'interfaccia utente, ma che diamine. :)