日期格式客户端验证 - MVC

Posted

技术标签:

【中文标题】日期格式客户端验证 - MVC【英文标题】:Date Format Client Validation - MVC 【发布时间】:2017-05-21 18:48:19 【问题描述】:

所以,我是 mvc、.net 等的新手,我遇到了日期格式的常见问题。我首先在我的模型上使用数据注释

    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "0:dd/MM/yyyy")]
    [DataType(DataType.Date)]
    [Display(Name = "Release Date")]
    public DateTime ReleaseDate  get; set; 

我的 Create.cshtml 如下所示:

    <div class="form-group">
        @Html.LabelFor(model => model.ReleaseDate, htmlAttributes: new  @class = "control-label col-md-2" )
        <div class="col-md-10">
            @Html.EditorFor(model => model.ReleaseDate, new  htmlAttributes = new  @class = "form-control", placeholder="dd/MM/yyyy"  )
            @Html.ValidationMessageFor(model => model.ReleaseDate, "", new  @class = "text-danger" )
        </div>
    </div>

我尝试创建一个对象,当我以 dd/MM/yyyy 格式输入日期时,我从 jquery 验证中收到以下错误消息:

发布日期字段必须是日期。

当我尝试格式为 MM/dd/yyyy 的日期并单击“创建”按钮时,我从服务器验证器收到了该消息:

值“5/28/2013”​​对于发布日期无效。

因此,任何一种格式都与其中一个验证器发生冲突。 经过大量研究后,我可以使它工作的唯一方法是使用自定义脚本覆盖 jquery 验证(尝试了我在这里找到的一对)。我最终使用了 John Reilly 的 globalize,它基于 jQuery 项目的 globalize 和 jQuery validation。 按照说明进行操作,一切正常。创建所有对象,格式之间没有冲突。

我的修改是:

网络配置:

  <system.web>
<globalization culture="en-GB" uiCulture="en-GB" />

_Layout.cshtml:

<script src="~/Scripts/jquery-1.10.2.js"></script>
<script src="~/Scripts/bootstrap.js"></script>
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/cldr.js"></script>
<script src="~/Scripts/cldr/event.js"></script>
<script src="~/Scripts/cldr/supplemental.js"></script>
<script src="~/Scripts/globalize.js"></script>
<script src="~/Scripts/globalize/number.js"></script>
<script src="~/Scripts/globalize/date.js"></script>

<script src="~/Scripts/jquery.validate.globalize.js"></script>

(如果我继续使用该解决方案,我会将它们包含在一个捆绑包中。)

唯一的问题是客户端验证消失了。不仅仅是日期验证,还有每个字段的验证。例如,如果我有一个必填字符串字段并且没有在其中放入任何内容,则我不会收到我用来获取该字段的 js 错误消息。或者,如果我在日期字段中输入“asdasdasd”,我不会收到任何 js 错误。只有在从服务器验证器中单击“创建”后才会出现错误。

那么,关于如何恢复客户端验证的任何想法?

谢谢

PS:我的js知识比较基础。

【问题讨论】:

【参考方案1】:

不要尝试将客户端日期格式与服务器端日期格式同步。如果您想在客户端使用某种格式,那么您可以指示 JQuery 的 datepicker 使用该格式。但不要指望服务器也会使用这种确切的格式。

请看我的回答 here 我详细解释了 MVC 如何处理日期。

【讨论】:

感谢您的回复。我得到了你在另一篇文章中使用的关于不同国家的例子,但我不明白这如何适用于我的案例。现在客户端/服务器格式已同步。服务器请求 dd/MM/yyyy,客户端也请求 dd/MM/yyyy。我的问题是现在客户端没有像以前那样给出任何错误消息了。 我的全部观点是,您的问题源于您尝试同步它们,这不是一个好的解决方案。如果您删除所有为同步而编写的 JQuery 代码,那么您的问题将不再存在。整个想法不是同步它们。 是的,但这不是我需要的。我需要它们都使用本地格式。

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

自定义格式日期的 MVC3 不显眼日期验证

ASP.NET MVC2 自定义 jQuery 验证:客户端

MVC DateTime 验证 - 英国日期格式

简单的正则表达式日期验证

jquery 验证允许“data-val-date”/MVC 的数字

Asp.net MVC 设置验证日期格式在 Chrome 上失败