Continua la convalida della data di nascita

Sto scrivendo un DOB22/12/1986 nella mia casella di testo e la convalida continua a sparare. Dice:

The field DOB must be a date.

Il mio MODELLO :

 [System.ComponentModel.DisplayName("DOB")] [DisplayFormat(DataFormatString = "@{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] [Required(ErrorMessage = "Date Of Birth is required")] [RegularExpression(@"{0:dd/MM/yyyy}", ErrorMessage = "Invalid Date")] // below is a link public DateTime DOB { get; set; } 

La mia vista:

 
@Html.LabelFor(model => model.DOB, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.DOB, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.DOB, "", new { @class = "text-danger" })

Nel MS SQL database il campo è: DateTime

Perché la mia convalida afferma che la data di digitazione non è valida?

Il motivo della convalida lato client è che il plug-in jquery.validate.js utilizzato da jquery.validate.unobtrusive.js convalida le date in base al formato MM/dd/yyyy e le date di immissione basate sul formato dd/MM/yyyy .

Il codice specifico utilizzato in jquery.validate.js per la convalida è

 date: function(value, element) { return this.optional(element) || !/Invalid|NaN/.test(new Date(value)); } 

che a seconda del browser il tuo utilizzo darà risultati diversi (in Chrome, la new Date('22/12/1986') 1987-10-11T13:30:00.000Z new Date('22/12/1986') restituisce la Invalid Date ma in FireFox restituisce 1987-10-11T13:30:00.000Z che è valido, solo non la data che hai inserito)

Devi sovrascrivere $.validator per formattare le date nella tua cultura. Un’opzione è usare il plugin jquery.globalize .

In alternativa puoi scrivere il tuo script. Si noti che il seguente script è tratto dal mio plugin utilizzato in combinazione con un metodo di estensione @Html.DatePickerFor() che genera un datepicker. Il metodo di estensione aggiunge attributi html per il formato data basato sulla cultura del server e viene letto con il var format = regex.exec(this.inputFormat); linea di codice che ho commentato e sostituito con il tuo formato hard coded. Se vuoi solo il formato dd/MM/yyyy , allora lo script può essere semplificato perché hai solo bisogno del formato ‘little-endian’

  

Nota a [RegularExpression] attributo [RegularExpression] non fa nulla e può essere rimosso.

Sostituisci . con / in entrambe le posizioni menzionate da Ganesh – attributo DisplayFormat attributo RegularExpression .