MVC 4日期文化问题?

18

我正在使用MVC 4,不知道Datetime文化信息是否存在错误?

我试图让澳大利亚日期(dd/MM/yyyy)正常工作,但是它一直显示日期格式错误,即使在web.config中全局化。我以为这是我的代码错误,但是即使你开始一个新项目,它仍然会发生。

我开始了一个新的MVC 4 Web应用程序。

将以下内容添加到web.config文件中:

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

然后我在AccountModels.cs文件中添加了以下内容:

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

然后我在Register.cshtml文件中添加了以下内容:

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

运行应用程序,转到注册页面,尝试输入日期,例如 26/03/2013,但却提示“格式无效”。

请帮忙解决。

4个回答

24

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

[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
虽然在web.config文件中设置文化应该可以做到这一点,但这样可以强制按照该格式进行显示。 更新 好吧,上面的答案并没有真正解决问题,尽管如果您确实想更改日期最初显示的格式,那么这很重要。一个重要的注意事项是,DisplayFormat属性不会被TextBoxFor助手所捕获,但会被EditorFor助手所捕获。
无论如何,接下来是真正的解决方案。问题在于jQuery验证在解析日期时未考虑文化。如果关闭客户端验证,那么在了解文化的服务器上可以很好地解析日期。
解决方法是覆盖jQuery验证日期并包含额外的jQuery全球化插件。您可以在这里找到globalize插件。您也可以使用Nuget包管理器轻松下载插件。我只需打开包管理器,在左侧选择Online选项卡,然后键入“globalize”进行搜索,它就是第一个结果。安装完成后,我包括了这两个文件:

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

您可以使用

那个方法不起作用。你能否尝试创建一个新项目并按照步骤操作吗?我试图解决这个问题,但已经快要发疯了。这是我的安装有问题吗?还是我的电脑有问题?我正在使用IIS Express,因为我直接从vs2012运行它。这可能是问题所在吗? - user2206329
这是我的项目链接,它只是一个全新的项目,包含上述更改.. https://dl.dropboxusercontent.com/u/87611366/MvcApplication2.zip - user2206329
我会在本地尝试一下,看看会发生什么。虽然我没有太多全球化应用程序或更改文化的经验,但这应该就是必要的。 - asymptoticFault
1
好的,我相信我搞定了!原来在 web.config 中设置文化就足够了,除非你使用 jQuery 验证。当我省略客户端验证时,日期正常工作;当我包括它时,它抱怨格式就像你说的一样。解决方法是覆盖 jQuery 日期验证,并包括一个额外的 jQuery 全球化库,可以允许以其他文化格式解析日期。请查看我的答案更新,以获得完整的解释。 - asymptoticFault
非常欢迎您 :-) 很高兴能帮助别人找到正确的解决方案。 - asymptoticFault
显示剩余4条评论

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

谢谢,这个可以在MVC5中使用。很遗憾,现在没有MVC5的“标准化”文件了... - DoubleVoid

0

创建一个代理函数怎么样?

var _date = $.validator.methods.date;

$.validator.methods.date = function (value, element) {
    return _date.call(this, Globalize.parseDate(value), element);
};

0

以下是有关土耳其文化的附加信息。

<globalization 
fileencoding="utf-8" 
requestencoding="utf-8" 
responseencoding="utf-8" 
culture="tr-TR" 
uiculture="tr-TR"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接