如何修复 mvc 中日期时间属性上的“字段必须是日期”

Posted

技术标签:

【中文标题】如何修复 mvc 中日期时间属性上的“字段必须是日期”【英文标题】:how to fix 'The field must be a date' on a datetime property in mvc 【发布时间】:2015-08-11 04:15:35 【问题描述】:

我需要为我的模型属性捕获日期和时间。在我的模型类中,我有以下内容

[Required]
[DataType(DataType.DateTime)]
public DateTime? CallBackDate  get; set; 

当我输入有效的日期时间(例如28/05/2015 15:55)时,我不断收到此错误The field CallBackDate must be a date.

我看到了类似的问题并尝试了各种答案,但似乎没有什么能摆脱这个。我正在使用不显眼的客户端验证,但我无法禁用它。

输入字段的来源有以下标记

<input autocomplete="off" class="jquery_datetimepicker form-control hasDatepicker" data-val="true" data-val-date="The field CallBackDate must be a date." data-val-required="The CallBackDate field is required." id="CallBackDate" name="CallBackDate" placeholder="Enter your CallBackDate" type="text" value="">

并且 jquery 日期时间选择器具有以下标记

$('.jquery_datetimepicker').datetimepicker(
    dateFormat: 'dd/mm/yy',
    minDate: 0,
    showWeeks: true,
    showStatus: true,
    highlightWeek: true,
    numberOfMonths: 1,
    showAnim: "scale",
    showOptions: 
        origin: ["top", "left"]
    ,
    timeFormat: 'hh:mm tt'
);

有什么想法吗?谢谢

【问题讨论】:

Jquery Datepicker Chrome 的可能重复项这似乎是客户端验证的一个已知问题。 @Coulton 这绝对不是 chrome 或浏览器问题 你看答案了吗?该问题的解决方案并非特定于chrome,解决方案是修改jquery.validate的行为。您说错误是由客户端验证引起的? 是的,我确实看过问题和答案,但它不相关! 您可以根据this answer 修改验证器 - 但取决于您使用的日期选择器 【参考方案1】:

由于 jquery.validate.unobtrusive.min.js 中的 MVC 错误(甚至在 MVC 5 中)可能会出现客户端验证问题,该错误不接受任何日期/日期时间格式。它不是由日期选择器或浏览器引起的。不幸的是,您必须手动解决它。

我的最终解决方案:

之前必须包含:

@Scripts.Render("~/Scripts/jquery-3.1.1.js")
@Scripts.Render("~/Scripts/jquery.validate.min.js")
@Scripts.Render("~/Scripts/jquery.validate.unobtrusive.min.js")
@Scripts.Render("~/Scripts/moment.js")

您可以使用以下方式安装 moment.js:

Install-Package Moment.js

然后你终于可以为日期格式解析器添加修复:

$(function () 
    $.validator.methods.date = function (value, element) 
        return this.optional(element) || moment(value, "DD.MM.YYYY", true).isValid();
    
);

【讨论】:

工作完美,谢谢。我只需要将格式更改为“DD/MM/YYYY”。 嗨,@lukyer,您的代码运行良好,但是当我将它与我的 MinAge 属性客户端验证结合使用时,我的 MinAge 验证变得不起作用。您对如何使这两种验证起作用有想法吗?我在这里发布了详细信息:***.com/questions/56629714/… 对于荷兰语的 DateTime,包括我不得不稍微改变格式的时间:D-M-YYYY HH:mm:ss。我希望将来 asp.net mvc 将使与其他语言环境的处理更加简单,这样我们就不必花几个小时去谷歌了。 我遇到了类似的问题,我也发布了这个问题:***.com/questions/61114448/… 我已经尝试使用您建议的解决方案,并且在调用函数来修复日期格式解析器时,我添加了一个调试器并且函数(值,元素),即值和元素参数显示为未定义。您能否提出相同的建议,我是否遗漏了什么或者我需要为参数传递一些适当的值? 我将日期格式更改为 yyyy-mm-dd - 修复了它,只是一个更好的日期格式。世界应该切换到这个。【参考方案2】:

我添加了日期格式解析器的修复,但我需要将格式设置为“L”,以便它可以在所有区域设置中工作:

$(function () 
$.validator.methods.date = function (value, element) 
    return this.optional(element) || moment(value, "L", true).isValid();

);

【讨论】:

【参考方案3】:

模型为例:

    [Display(Name = "Insert Start Date")]
    [Required(ErrorMessage = "You must specify the date of the event!")]
    [DataType(DataType.DateTime, ErrorMessage = "Podaj prawidłową datę wydarzenia")]
    [DisplayFormat(DataFormatString = "0:yyyy-MM-dd HH:mm", ApplyFormatInEditMode = true)]
    public DateTime StartDate  get; set; 

    [Display(Name = "Insert End Date")]
    [Required(ErrorMessage = "You must specify the date of the event!")]
    [DataType(DataType.DateTime, ErrorMessage = "Podaj prawidłową datę wydarzenia")]
    [DisplayFormat(DataFormatString = "0:yyyy-MM-dd HH:mm", ApplyFormatInEditMode = true)]
    public DateTime EndDate  get; set; 

查看我的示例代码:

<script>
$('#startDate').datetimepicker(
    onClose: function (dateText, inst) 
        var endDateTextBox = $('#endDate');
        if (endDateTextBox.val() != '') 
            var testStartDate = new Date(dateText);
            var testEndDate = new Date(endDateTextBox.val());
            if (testStartDate > testEndDate)
                endDateTextBox.val(dateText);
        
        else 
            endDateTextBox.val(dateText);
        
    , dateFormat: 'yy-mm-dd',
    onSelect: function (selectedDateTime) 
        var start = $(this).datetimepicker('getDate');
        $('#endDate').datetimepicker('option', 'minDate', new Date(start.getTime()));
    
); ....

这带来了积极的影响: dateFormat: 'yy-mm-dd',

【讨论】:

here 是另一个可行的解决方案,希望有所帮助。【参考方案4】:
$(function () 
    $.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;
    );
    $(".datetype").datepicker( dateFormat: 'dd/mm/yy' );
);

将此代码放在文件 datepicker.js 中,并将此文件包含在 html 中

【讨论】:

【参考方案5】:

您需要确保您的应用程序的Culture 设置正确。

示例

以下示例显示文化如何影响日期解析:https://dotnetfiddle.net/vXQTAZ

DateTime dateValue;
string dateString = "28/05/2015 15:55";

if (DateTime.TryParse(dateString, CultureInfo.CreateSpecificCulture("en-US"), DateTimeStyles.None, out dateValue))

    Console.WriteLine("Valid en-US date.");

else

    Console.WriteLine("Not a valid en-US date.");


if (DateTime.TryParse(dateString, CultureInfo.CreateSpecificCulture("fr-FR"), DateTimeStyles.None, out dateValue))

    Console.WriteLine("Valid fr-FR date.");

else

    Console.WriteLine("Not a valid fr-FR date.");

输出

Not a valid en-US date.

Valid fr-FR date.

客户端设置

您可能还需要确保您的客户端验证器使用正确的文化/全球化。如果您在 MVC 中使用 jQuery 验证插件,请参阅此扩展以帮助修改该插件以满足您的需求:http://blog.icanmakethiswork.io/2012/09/globalize-and-jquery-validate.html

【讨论】:

更新了答案以包括对客户端验证器的必要更改。【参考方案6】:

我必须验证dd/mm/yyyy hh:ii 并在@lukyer 的帮助下添加了答案 DD/MM/YYYY HH:mm 工作正常 希望对您有所帮助!

【讨论】:

【参考方案7】:

我无法通过其他答案来解决它。就我而言,使用 TextBoxFor 不是强制性的。我改用了 TextBox。

型号

[Required(ErrorMessage = "Required")]
[DisplayFormat(DataFormatString = "0:dd/MM/yyyy", ApplyFormatInEditMode = true)]
public DateTime MyDateget;set;

查看

@Html.TextBox("MyDate", DateTime.Now.ToString(), new @type="datetime")

【讨论】:

【参考方案8】:
    在 additional-methods.js 文件中添加以下方法,并将此文件包含在您的项目中:

      $.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;
        );
    视图必须是这样的:
       @Html.TextBoxFor(model => model.DOB, new  @class = "datetype", type ="text" )
       @Html.ValidationMessageFor(model => model.DOB)
     $(function () 
              $(".datetype").datepicker( dateFormat: 'dd/mm/yy' ); 
      );

它对我有用。

【讨论】:

【参考方案9】:

本地化或 moment.js 在使用 datetimepicker 时对我不起作用。拆分小时,然后检查正在工作。我在用 格式:'dd.mm.yyyy hh:ii' 用于日期时间选择器。

$.validator.methods.date = function (value, element) 
    var dateL = value.split(" ");
    var date = dateL[0].split(".");
    var hour = dateL.length > 1 ? dateL[1].split(":") : "";
    return this.optional(element) || !/Invalid|NaN/.test(dateL.length > 1 ? new Date(date[2], date[1], date[0],hour[0],hour[1]).toString() : new Date(date[2], date[1], date[0]).toString());

【讨论】:

【参考方案10】:

如果您使用 JQuery 不显眼的验证,您可以添加后面的规则并更改客户端验证消息。

$('#inputName').rules('add',
   messages:
       date:'Invalid format date'
   
)

【讨论】:

【参考方案11】:

在我的模型中,我有:

[DisplayFormat(DataFormatString = "0:dd MMM yyyy", ApplyFormatInEditMode = true)].

在我的脚本中,我有:

    $(function () 
                $('.datepicker').datepicker(
                    changeMonth: true,
                    changeYear: true,
                    format: "dd MMM yyyy"
                );
        );

当我将脚本的格式更改为格式时:dd M yyyy - 它起作用了。

【讨论】:

问题是关于日期时间选择器而不是日期选择器【参考方案12】:

这对我在客户端和服务器端都有效,我也安装了 moment.js。

$("#datepicker").datepicker();
$('#datepicker').datepicker("option", "dateFormat", "dd/mm/yy");

$.validator.methods.date = function (value, element) 
    return this.optional(element) || moment(value, "DD/MM/YYYY", true).isValid();

【讨论】:

【参考方案13】:
    安装moment.js(安装包Moment.js) 打开jquery.validate.js,找到方法date:function(value, element)

    为此替换内容:

    var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
    return this.optional(element) || (isChrome ? moment(value, 'L').isValid() : !/Invalid|NaN/.test(new Date(value)));
    
    完成

【讨论】:

不建议更改库代码。如果您使用包管理器并安装最新版本,这将被清除

以上是关于如何修复 mvc 中日期时间属性上的“字段必须是日期”的主要内容,如果未能解决你的问题,请参考以下文章

如何修复php中日期到日期之间的错误

如何绑定到列表作为 MVC 3 Razor 中模型上的属性?

如何从 C# 控制器(OData)的 JSON 序列化中修复丢失的子对象(导航属性)?

将应用程序发布到 IIS 时,如何在 MVC 中以 dd/mm/yyyy 格式绑定日期时间?

如何使用打字稿和情感修复 Box 组件上的“属性“颜色”类型不兼容”

如何修复嵌入式模板上的任何指令未使用的属性绑定 ng-forOf? [复制]