Ошибка на стороне клиента возникает из-за по умолчанию jquery.validate
проверяет значение используя формат MM/dd/yyyy
. Вы можете переопределить функцию $.validator.addMethod('date', function (value, element)
, чтобы проверить, что это значение находится в ожидаемом dd/MM/yyyy
. Обратите внимание на следующий код из моей JQuery плагин, связанный с методом @Html.DatePickerFor()
хелперов, который делает атрибут data-dateformat
на выходе на основе культуры серверов, так что это может быть избыточна для ваших потребностей
Добавить следующие сценарии (не в document.ready
, но после того, как jquery.validate.unobtrusive
)
Date.prototype.isValid = function() {
return !isNaN(this.getTime());
}
globalDate = function (value, formatString) {
// Initialise a new date
var date = new Date();
date.setHours(0, 0, 0, 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]+)/);
//var format = regex.exec(this.inputFormat);
var format = regex.exec(formatString);
// 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;
}
$.validator.addMethod('date', function (value, element) {
var format = "dd/MM/yyyy";
return this.optional(element) || globalDate(value, format).isValid();
}
Если вы только когда-либо хотите проверить формат dd/MM/yyyy
, то вы могли бы упростить функцию globalDate()
только с помощью
var date = new Date();
date.setHours(0, 0, 0, 0);
var components = value.split('/');
var day = components[0];
var month = components[1];
var year = components[2];
date.setFullYear(year);
....
Редактировать
В дополнении к комментариям Op в отношении стороны сервера упущения проверки, культура сервера должна принимать строку даты в формате dd/MM/yyyy
. В файле web.config.cs
<system.web>
<globalization culture="en-AU" uiCulture="en-AU"/> // adjust to your culture code
....
Вы можете использовать 'jquery.globalize' или переопределить Jquery валидатор на дату согласно [этот ответ] (http://stackoverflow.com/questions/27285458/jquery-ui-datepicker- and-mvc-view-model-type-datetime/27286969 # 27286969) –
Вы можете указать формат в модели. – Mairaj
@ StephenMuecke не работает – Athul