18

I am using MVC 4 and am wondering if there is a bug in the Datetime culture info?

I am trying to get Australian dates to work (dd/MM/yyyy), but it keeps saying that the date format is wrong, even after puttig a globalizaton to the web.config. I thought it was an error with my code, but even if you start a new project it still happens.

I started a new MVC 4 Web application.

Added the following to the web.config file

<globalization culture="en-AU" uiCulture="en-AU" />

Then I added the following to the AccountModels.cs file:

[DataType(DataType.DateTime)]
[Required(ErrorMessage="Date is required")]
public DateTime? MyDate { get; set; }

Then I added the following to the Register.cshtml file:

<li>
    @Html.LabelFor(m => m.MyDate)
    @Html.TextBoxFor(m => m.MyDate)
</li>

Run the application, go to the register page, try a date like 26/03/2013 and it says not a valid format.

Please help.

4

4 回答 4

24

尝试将此属性添加到您的MyDate属性:

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]

虽然在web.config中设置文化应该可以做到,但这应该强制它进入那种格式。

更新

好的,所以上面的答案并不能真正解决问题,但如果您确实想更改日期最初显示的格式,这一点很重要。一个重要的注意事项是该DisplayFormat属性不是由助手获取的,TextBoxFor而是由EditorFor助手获取的。

无论如何,进入真正的解决方案。问题是 jQuery 验证在解析日期时没有考虑文化。如果您关闭客户端验证,则可以在知道文化的服务器上很好地解析日期。

修复方法是覆盖对日期的 jQuery 验证并包含一个额外的 jQuery 全球化插件。你可以在这里找到全球化插件。您还可以使用 Nuget 包管理器轻松下载插件。我刚刚打开包管理器,选择左侧的在线选项卡并在搜索中输入“全球化”,这是第一个结果。一旦你安装了它,我包括了这两个文件:

globalize.js
globalize.culture.en-AU.js

您可以使用脚本标记直接包含它们,也可以将它们放在一个包中,也许与其他 jQuery 验证文件一起。

一旦你有了这些,你将需要添加以下脚本来覆盖 jQuery 对日期的验证:

<script type="text/javascript">
    $(function () {
        $.validator.methods.date = function (value, element) {
            Globalize.culture("en-AU");
            // you can alternatively pass the culture to parseDate instead of
            // setting the culture above, like so:
            // parseDate(value, null, "en-AU")
            return this.optional(element) || Globalize.parseDate(value) !== null;
        }
    });
</script>

就是这样,这应该可以解决问题。我将此解决方案归功于此答案:JQuery Validation and MVC 3. How to change date format 我还想针对您的问题提供更多解释。

于 2013-08-31T19:08:16.307 回答
1

接受的答案不是最新的。我最终的工作解决方案:

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

您必须在之前包括:

@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
于 2017-03-08T15:55:02.907 回答
0

创建代理功能怎么样?

var _date = $.validator.methods.date;

$.validator.methods.date = function (value, element) {
    return _date.call(this, Globalize.parseDate(value), element);
};
于 2013-09-20T10:33:35.967 回答
0

在下面的其他土耳其文化中。

<globalization 
fileencoding="utf-8" 
requestencoding="utf-8" 
responseencoding="utf-8" 
culture="tr-TR" 
uiculture="tr-TR"/>
于 2017-03-17T06:24:12.657 回答