ASP.NET MVC5以错误的格式存储日期

时间:2015-05-09 10:29:30

标签: asp.net asp.net-mvc-5 jquery-ui-datepicker date-format datefield

最后几天我很难说服MVC5项目按照我的意愿处理日期。经过密集的谷歌搜索后,我尝试了很多次,以使其正常工作,但没有成功。

问题在于:

我需要以dd.MM.yyyy格式(即15.07.2015)在我的网页上显示和编辑日期。对于编辑我还需要使用jquery ui datepicker。这里的事情是我已经能够成功设置该datepicker以请求的格式显示日期,jquery验证现在正确地验证给定格式的日期。至于UI到目前为止都那么好。当我点击提交按钮时出现问题 - 有一条错误消息:

值'15 .07.2015'对于开始日期无效。

经过简单的调查,我发现当日期传递给服务器时,它已经切换格式 - 而不是dd.MM.yyyy,日期被视为MM.dd.yyyy。换句话说,只有当日期的某一部分高于12时,才会弹出错误。

以下是我的代码中的一些亮点:

在我的日期模型中,我有这个:

[Required]
[Display(Name = "Start Date")]
[DataType(DataType.Date)]
[UIHint("Date")]
[DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}", ApplyFormatInEditMode = true)]
public DateTime DateStarts;

我认为我需要做的就是让日期以指定的格式显示,并强制用户以正确的格式填写日期文本框。

如[UIHint(“Date”)]中给出的,我有自己的模板用于渲染文本框以进行编辑。该模板的实现如下:

@model Nullable<DateTime>

@{

DateTime dt = DateTime.Now;

if (Model != null)
{
    dt = (System.DateTime)Model;
}

@Html.TextBox("", dt.ToString("dd.MM.yyyy"), new { @class = "form-control datecontrol", type = "text", data_val_date = "Field must have format dd.MM.yyyy" })
<i class="fa fa-calendar form-control-feedback lowerzindex"></i>

}

jquery datepicker具有以下实现:

 $('.datecontrol').datepicker({
    onClose: function () { $(this).valid(); },
    minDate: "-1M",
    dateFormat: "dd.mm.yy",
});

所以即使是datepicker也知道格式应该是什么样子。

最后一个组件是jquery.validation的验证:

 $.validator.addMethod(
    'date',
    function (value, element, params) {
        if (this.optional(element)) {
            return true;
        };
        var result = false;
        try {
            $.datepicker.parseDate('dd.mm.yy', value);
            result = true;
        } catch (err) {
            result = false;
        }
        return result;
    },
    ''
);

我知道日期是以某种文化中立格式传递给服务器的,但我认为当我使用请求的格式在许多地方修饰代码时,这将确保转换为文化中性格式将正确完成。或者我错过了其他什么?

由于

1 个答案:

答案 0 :(得分:5)

您的问题在于您没有为您的应用程序设置正确的Culture。您的请求最终会在month-day-year订单(可能位于en-US下)导致您出现问题的文化下执行。

最简单的解决方案是在day-month-year中设置实际具有.订单和web.config作为日期分隔符的文化,例如:

<configuration>
   <system.web>
       <globalization uiCulture="de-DE" culture="de-DE" />
       ...

https://msdn.microsoft.com/en-us/library/bz9tc508%28v=vs.140%29.aspx

在将发布的数据解析并绑定到模型/参数时,MVC使用当前文化。 建议在整个范围内使用相同的日期分隔符 - html,client,javascript,server culture,...