c# - 我无法日期时间验证表单中的字段

标签 c# jquery asp.net asp.net-mvc unobtrusive-validation

我正在使用这个对象:

[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/

相关文章:

c# - 我可以使用Entity Framework版本6或7自动更新对象及其子对象吗?

c# - MIDI 入门

c# - 从 C# 代码加密/解密连接字符串

c# - 追踪 Windows 服务中的 stackoverflow 错误

javascript - 打字机脚本运行一次后停止运行

jquery - 将 jquery ui 工具提示图标与文本对齐

c# - 如何使用 pdfium 查看器在 pdf 中显示注释?

javascript - 获取没有 id 的 HTML 中特定段落的链接

asp.net - 使用 Auth0 在 ASP.NET 中按角色/组进行授权

c# - 如何在 C# 中将 List<dynamic> 转换为 List<OurClass>