【发布时间】:2015-05-09 10:29:30
【问题描述】:
最近几天,我很难说服 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",
});
所以即使是日期选择器也知道格式应该是什么样子。
最后一个组件是 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;
},
''
);
我知道日期是以某种文化中性格式传递给服务器的,但我认为当我用请求的格式在许多地方修饰代码时,这将确保正确地转换为该文化中性格式。还是我错过了什么?
谢谢
【问题讨论】:
-
服务器的文化是什么?它的日期格式是 dd/MM/yyyy 吗?
-
您可以删除以下
[DataType(DataType.Date)]和[DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}", ApplyFormatInEditMode = true)]中的ApplyFormatInEditMode = true-@Html.EditorFor()使用这两者来呈现浏览器 HTML5 日期选择器,但您使用的是 jquery 插件,因此它们什么都不做。然后你也可以删除你的模板并将其替换为@Html.TextBoxFor(m => m.DateStarts, "{0:dd.MM.yyyy}", new { @class = "form-control datecontrol" })
标签: asp.net asp.net-mvc-5 jquery-ui-datepicker date-format datefield