日期格式 dd/MM/yyyy 在 asp.net mvc 5 中不起作用
date format dd/MM/yyyy not working in asp.net mvc 5
我正在开发一个 asp.net mvc 5 应用程序,我正在尝试为 dd/MM/yyyy 格式设置验证,我已经一直在努力寻找合适的解决方案但没有成功,我希望它接受:
24/01/2016
但它显示验证消息为:
The field JoiningDate must be a date.
这是我试过的方法:
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime JoiningDate { get; set; }
此外,我希望它在用户端以 dd/MM/yyyy 格式显示日期,但这是我问题的第二部分,首先,它应该至少允许输入有效的日期。我坚持这一点,任何帮助都会 深切 感激,我搜索了所有内容,但我无法达到目的,提前致谢 :)
我得到了答案,我使用了自定义的ModelBinder,为了解决这个问题,
首先,我在Global.asax的application_start方法中注册了这一行:
ModelBinders.Binders.Add(typeof(DateTime?), new MyDateTimeModelBinder());
这是自定义的 ModelBinder :
public class MyDateTimeModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var displayFormat = bindingContext.ModelMetadata.DisplayFormatString;
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (!string.IsNullOrEmpty(displayFormat) && value != null)
{
DateTime date;
displayFormat = displayFormat.Replace("{0:", string.Empty).Replace("}", string.Empty);
// use the format specified in the DisplayFormat attribute to parse the date
if (DateTime.TryParseExact(value.AttemptedValue, displayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
{
return date;
}
else
{
bindingContext.ModelState.AddModelError(
bindingContext.ModelName,
string.Format("{0} is an invalid date format", value.AttemptedValue)
);
}
}
return base.BindModel(controllerContext, bindingContext);
}
}
感谢 Darin Dimitrov 的 answer!
我发现最简单的方法是放在 web.config 下面的代码中
<system.web>
<globalization uiCulture="en" culture="en-GB"/>
</system.web>
我找到了更简洁的解决方案。
由于 jquery.validate.unobtrusive.min.js 中的 MVC 错误(即使在 MVC 5 中)可能会出现客户端验证问题,不接受 date/datetime以任何方式格式化。不幸的是你必须手动解决它。
我最终的解决方案:
您必须在之前包括:
@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
然后您终于可以为日期格式解析器添加修复:
$(function () {
$.validator.methods.date = function (value, element) {
return this.optional(element) || moment(value, "DD.MM.YYYY", true).isValid();
}
});
我正在开发一个 asp.net mvc 5 应用程序,我正在尝试为 dd/MM/yyyy 格式设置验证,我已经一直在努力寻找合适的解决方案但没有成功,我希望它接受:
24/01/2016
但它显示验证消息为:
The field JoiningDate must be a date.
这是我试过的方法:
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime JoiningDate { get; set; }
此外,我希望它在用户端以 dd/MM/yyyy 格式显示日期,但这是我问题的第二部分,首先,它应该至少允许输入有效的日期。我坚持这一点,任何帮助都会 深切 感激,我搜索了所有内容,但我无法达到目的,提前致谢 :)
我得到了答案,我使用了自定义的ModelBinder,为了解决这个问题,
首先,我在Global.asax的application_start方法中注册了这一行:
ModelBinders.Binders.Add(typeof(DateTime?), new MyDateTimeModelBinder());
这是自定义的 ModelBinder :
public class MyDateTimeModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var displayFormat = bindingContext.ModelMetadata.DisplayFormatString;
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (!string.IsNullOrEmpty(displayFormat) && value != null)
{
DateTime date;
displayFormat = displayFormat.Replace("{0:", string.Empty).Replace("}", string.Empty);
// use the format specified in the DisplayFormat attribute to parse the date
if (DateTime.TryParseExact(value.AttemptedValue, displayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
{
return date;
}
else
{
bindingContext.ModelState.AddModelError(
bindingContext.ModelName,
string.Format("{0} is an invalid date format", value.AttemptedValue)
);
}
}
return base.BindModel(controllerContext, bindingContext);
}
}
感谢 Darin Dimitrov 的 answer!
我发现最简单的方法是放在 web.config 下面的代码中
<system.web>
<globalization uiCulture="en" culture="en-GB"/>
</system.web>
我找到了更简洁的解决方案。
由于 jquery.validate.unobtrusive.min.js 中的 MVC 错误(即使在 MVC 5 中)可能会出现客户端验证问题,不接受 date/datetime以任何方式格式化。不幸的是你必须手动解决它。
我最终的解决方案:
您必须在之前包括:
@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
然后您终于可以为日期格式解析器添加修复:
$(function () {
$.validator.methods.date = function (value, element) {
return this.optional(element) || moment(value, "DD.MM.YYYY", true).isValid();
}
});