我正在使用这个对象:
[Required]
[Display(Name = "AuditDate", ResourceType = typeof(Resources.Audit))]
[DisplayFormat(DataFormatString = "{dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime dateAudit { get; set; }
在我的表单的这一部分:
@Html.TextBox("dateAudit", String.Format("{0:d}", Model.dateAudit.ToString("dd'/'MM'/'yyyy"), new { @class = "form-control" }))
当我尝试输入日期时,我无法提交表单(出现 DatePicker 对话框),因为该字段有问题。我在字段中添加了一个 ValidationMessageFor,它告诉我该字段不包含有效日期:
@Html.ValidationMessageFor(model => model.dateAudit, "", new { @class = "text-danger" })
这是此时为该字段生成的 HTML 错误消息:
<input data-val="true" data-val-date="The field Date must be a date." data-val-required="The field Date is required." id="dateAudit" name="dateAudit" type="text" value="10/03/2015" class="hasDatepicker input-validation-error">
我还尝试在配置文件中为所有应用程序设置区域性:
<globalization uiCulture="fr-FR" culture="fr-FR" />
如果我选择像 3 月 1 日这样的日期,格式为 01/03/2015
,则没有问题并且模型绑定(bind)可以识别它,但是当我选择 20th of March 时,该字段无法验证(我怀疑它认为我正在尝试输入 20 作为月份)。
我找到了 this library这可能有助于客户端验证,但它似乎不兼容所有浏览器,所以我不能使用它。我正在考虑完全放弃客户端验证,只在后端验证日期字段。
感谢您的帮助。
编辑:我忘了告诉你我为日期选择器使用了 jquery ui 重新定义:
/* French initialisation for the jQuery UI date picker plugin. */
/* Written by Keith Wood (kbwood{at}iinet.com.au),
Stéphane Nahmani (sholby@sholby.net),
Stéphane Raimbault <stephane.raimbault@gmail.com> */
(function (factory) {
if (typeof define === "function" && define.amd) {
// AMD. Register as an anonymous module.
define(["../datepicker"], factory);
} else {
// Browser globals
factory(jQuery.datepicker);
}
}(function (datepicker) {
datepicker.regional['fr'] = {
closeText: 'Fermer',
prevText: 'Précédent',
nextText: 'Suivant',
currentText: 'Aujourd\'hui',
monthNames: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin',
'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],
monthNamesShort: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin',
'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],
dayNames: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],
dayNamesShort: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
dayNamesMin: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
weekHeader: 'Sem.',
dateFormat: 'dd/mm/yy',
firstDay: 1,
isRTL: false,
showMonthAfterYear: false,
yearSuffix: ''
};
datepicker.setDefaults(datepicker.regional['fr']);
return datepicker.regional['fr'];
}));
最佳答案
您可以创建自己的方法来覆盖 jquery.validator 默认方法。请注意,下面的代码可能对您的需要有点矫枉过正(它是我自己的 @Html.DatePicker()
助手插件的一部分,它根据服务器的 CultureInfo
呈现日期选择器>)
// Override default date validator format to allow culture specific format
$.validator.methods.date = function (value, element) {
return this.optional(element) || globalDate(value).isValid();
};
注意:不要将上述方法包裹在document.ready()
Date.prototype.isValid = function () {
return !isNaN(this.getTime());
}
var inputFormat = 'dd/MM/yyyy';
// datepicker.prototype.globalDate = function (value) {
function globalDate(value) {
// Initialise a new date
var date = new Date(0);
if (value == undefined) {
// Return todays date
return date; // adjust to suit your needs
}
// 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(inputFormat);
// 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;
}
编辑:基于编辑过的问题(OP 使用的是 jQuery UI 日期选择器)它可能只是
$.validator.addMethod('date', function (value, element) {
if (this.optional(element)) {
return true;
}
var valid = true;
try {
$.datepicker.parseDate('dd/mm/yy', value);
}
catch (err) {
valid = false;
}
return valid;
});
$('#dateAudit').datepicker({ dateFormat: 'dd/mm/yy' });
旁注:建议您使用强类型助手并传递格式字符串
@Html.TextBoxFor(m => m.dateAudit, "{0:dd/MM/yyyy}")
关于c# - 我无法日期时间验证表单中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28958464/