c# - pin - Fecha de nacimiento validación sigue mostrando
registro clave aeat (2)
La razón de la validación del lado del cliente es que el complemento
jquery.validate.js
utilizado por
jquery.validate.unobtrusive.js
valida las fechas en función del formato
MM/dd/yyyy
y sus fechas de entrada en un formato
dd/MM/yyyy
.
El código específico utilizado en
jquery.validate.js
para la validación es
date: function(value, element) {
return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
}
que, dependiendo del navegador que esté utilizando, dará resultados diferentes (en Chrome, la
new Date(''22/12/1986'')
1987-10-11T13:30:00.000Z
new Date(''22/12/1986'')
devuelve
Invalid Date
pero en FireFox devuelve
1987-10-11T13:30:00.000Z
que es válido, pero no la fecha que ingresaste)
$.validator
anular
$.validator
para formatear fechas en su cultura.
Una opción es usar el complemento
jquery.globalize
.
Alternativamente, puede escribir su propio guión.
Tenga en cuenta que el siguiente script se toma de mi propio complemento utilizado junto con un método de extensión
@Html.DatePickerFor()
que genera un
@Html.DatePickerFor()
.
El método de extensión agrega atributos html para el formato de fecha basado en la cultura del servidor y se lee con
var format = regex.exec(this.inputFormat);
línea de código que he comentado y reemplazado por su formato codificado.
Si solo desea el formato
dd/MM/yyyy
, entonces el script puede simplificarse porque solo necesita el formato ''little-endian''
<script type="text/javascript">
// Override default date validator format to allow culture specific format
$.validator.methods.date = function (value, element) {
return this.optional(element) || globalDate(value).isValid();
};
globalDate = function (value) {
// Initialise a new date
var date = new Date(0);
if (value == undefined) {
// Return todays date
return date;
}
// Get the components of the format
// The separator can be forward slash, hyphen, dot and/or space
var regex = new RegExp(/([dMy]+)([/s/.-]+)([dMy]+)([/s/.-]+)([dMy]+)/);
//------------- see notes above
//var format = regex.exec(this.inputFormat);
var format = regex.exec(''dd/MM/yyyy'');
//-------------
// Get the components of the value
regex = new RegExp(/(/d+)([/s/.-]+)(/d+)([/s/.-]+)(/d+)/);
value = regex.exec(value);
// Check the value is valid
if (value === null || value[2] !== format[2] || value[4] !== format[4]) {
// Its not valid
date.setTime(Number.NaN);
return date;
}
// TODO: What if year entered as 2 digits?
var day = Number.NaN;
var month = Number.NaN;
var year = Number.NAN;
if (format[1].charAt(0) === ''d'') {
// little-endian (day, month, year)
day = parseInt(value[1]);
month = parseInt(value[3]) - 1;
year = parseInt(value[5]);
} else if (format[1].charAt(0) === ''M'') {
// middle-endian (month, day, year)
day = parseInt(value[3]);
month = parseInt(value[1]) - 1;
year = parseInt(value[5]);
} else {
// big endian (year, month, day)
day = parseInt(value[5]);
month = parseInt(value[3]) - 1;
year = parseInt(value[1]);
}
date.setFullYear(year);
date.setMonth(month);
date.setDate(day);
// Check its valid
if (date.getDate() !== day || date.getMonth() !== month || date.getFullYear() !== year) {
date.setTime(Number.NaN);
return date;
}
return date;
}
// Methods
Date.prototype.isValid = function () {
return !isNaN(this.getTime());
}
</script>
Nota al
[RegularExpression]
: su atributo
[RegularExpression]
no hace nada y puede eliminarse.
Estoy escribiendo un
DOB
-
22/12/1986
en mi cuadro de texto y la validación sigue disparando.
Dice:
The field DOB must be a date.
Mi modelo
[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; }
MI VISTA
<div class="form-group">
@Html.LabelFor(model => model.DOB, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.DOB, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.DOB, "", new { @class = "text-danger" })
</div>
</div>
En la
MS SQL database
el campo es:
DateTime
¿Por qué mi validación dice que la fecha que escribo no es válida?
Reemplazar
con
/
en ambos lugares como Ganesh mencionó: atributo
DisplayFormat
Y atributo
RegularExpression
.