MVC DateTime 验证 - 英国日期格式

Posted

技术标签:

【中文标题】MVC DateTime 验证 - 英国日期格式【英文标题】:MVC DateTime validation - UK Date format 【发布时间】:2012-08-21 10:31:58 【问题描述】:

我有一个简单的视图,其中包含两个日期字段,并为不显眼的 javascript 验证添加了 ValidationMessageFor 控件。

我的问题是我一直被告知我的日期无效,但格式正确 (dd/MM/yyyy)

我已将 <globalization culture="en-GB" uiCulture="en-GB"/> 添加到我的 web.config,并且还在每个 DateTime 属性中添加了 [DisplayFormat(DataFormatString = "0:dd/MM/yyyy", ApplyFormatInEditMode = true)],但它仍然不接受英国格式的日期。

我在这里有什么明显的遗漏吗?

【问题讨论】:

所以,通过这篇文章解决了 -> ***.com/questions/511439/… 但是为什么我需要创建自定义验证方法?当然,如果我在模型中指定格式,并指定我的文化,它应该使用该日期格式吗? 您的服务器没有按照您需要的文化运行吗? @SimonWhitehead 好像是这样,但是在我的开发机器上本地运行时也会发生这种情况 我也遇到过类似的问题:***.com/questions/9821407/mvc3-en-gb-dates-in-get 因为微软相信在美国以外没有人存在,这就是为什么 :) 虽然“没有人在外面”的评论是真的,但我认为这有点误导,因为不是 MS,而是大多数美国开发人员认为在美国以外没有人存在, 与此同时,大多数英国开发者认为在英国以外没有人存在,依此类推…… 【参考方案1】:

其实你只需要为日期重载不显眼的 JavaScript 验证方法

jQuery(function ($) 
    $.validator.addMethod('date',
    function (value, element) 
        if (this.optional(element)) 
            return true;
        

        var ok = true;
        try 
            $.datepicker.parseDate('dd/mm/yy', value);
        
        catch (err) 
            ok = false;
        
        return ok;
    );
);

【讨论】:

additional-methods.js库中有一种国际日期验证方法可以替代使用。 在我的例子中,我已经替换了 parseDate() 调用,因为我想使用日期和时间(而且似乎 datepicker 不支持这个),所以我使用了这个:` var re = /\d4-[01]\d-[0-3]\d [0-2]\d:[0-5]\d/;变量确定;试试 ok = value.match(re) != null; ` 澄清一下,@lutecki 的正则表达式验证 yyyy-mm-dd hh:mm【参考方案2】:

Bohdan 的例子很有效!我已经 +1 你的回答伙伴。

为了完整起见,我写了一篇关于如何集成所有部分(模型、视图、自定义 EditorTemplate、jQuery 包括和添加 Bohdan 的解决方案)的博文。

您可以在这里阅读:http://www.kestrelblackmore.com/blog/jquery-datepicker-mvc4

【讨论】:

把它放在博客上并一步一步解释整个过程真是太好了,谢谢。【参考方案3】:

我知道它很旧,但使用它我向输入添加了一个具有当前日期格式的属性(我使用 CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern.ToLower() 从 ASP MVC 代码中获取)。

然后我重写了验证 javascript 以使用属性中找到的格式。

        var format = "mm/dd/yyyy";
        if (element.attributes["data-format"]) 
            format = element.attributes["data-format"].value;
        

我还为 jquery ui datepicker 读取了相同的属性。它可能没有那么有用,但它至少可以使格式与文化保持一致。虽然它可以帮助某人

【讨论】:

【参考方案4】:

与其他答案相比,我采取了不同的方法来解决这个问题。使用 jQuery 添加一个新的日期函数,该函数将强制日期使用应用程序中设置的当前本地文化。

$.validator.addMethod('date', function (value, element) 
                var d = new Date();
                return this.optional(element) || !/Invalid|NaN/.test(new Date(d.toLocaleDateString(value)));
            );

如果 jQuery 验证失败。我将此答案归功于 Elton Stoneman 的帖子,可以阅读 here

希望这对其他人有帮助。

【讨论】:

嗨,Aim,看起来是一个不错的简单解决方案。你在哪里插入这个? @mattpm 您将把它插入到具有日期字段的视图的 JavaScript 代码中【参考方案5】:

尝试在 jquery.validate.js 中直接更改。使用 $.datpicker

date: function (value, element) 
    var s = value;

    var ind2 = 3;
    var ind3 = 6;
    var ind4 = 4;

    if (s.substr(6, 1) != "2") 
        ind2 = ind2 + 1;
        ind3 = ind3 + 1;
        ind4 = ind4 + 1;
    

    var ndan = s.substr(0, 2);
    var nmje = s.substr(ind2, 2);
    var ngod = s.substr(ind3, ind4);

    var ns = ngod + "," + nmje + "," + ndan;

    return this.optional(element) || !/Invalid|NaN/.test(new Date(ns));

【讨论】:

以上是关于MVC DateTime 验证 - 英国日期格式的主要内容,如果未能解决你的问题,请参考以下文章

使用 pandas.to_datetime 转换时指定日期格式

将英国格式日期转换为日期时间

需要使用 MVC 中的表单验证从服务器端验证 DateTime

Bootstrap Datetimepicker 英国日期格式发布为美国格式

jQuery datepicker 验证失败

ASP.NET Web API 日期时间绑定