在asp.net mvc中格式化datetime 4

如何强制在asp.net mvc 4中的date时间的格式? 在显示模式下,它显示为我想要的,但在编辑模式中不显示。 我正在使用displayfor和editorfor和applyformatineditmode = true与dataformatstring =“{0:dd / MM / yyyy}”我试过了:

  • web.config中的全球化(包括他们两个)与我的文化和uiculture。
  • 修改application_start()中的文化和uiculture
  • date时间的自定义模型绑定器

我不知道如何强制它,我需要inputdate为dd / MM / yyyy不是默认的。

更多信息:我的viewmodel是这样的

[DisplayName("date of birth")] [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] public DateTime? Birth { get; set; } 

在我看来,我使用@Html.DisplayFor(m=>m.Birth)但这工作如预期(我看到格式),并inputdate我使用@Html.EditorFor(m=>m.Birth)但如果我尝试并input像13/12/2000东西是失败的错误,它不是一个有效的date(12/13/2000和2000/12/13工作正常,但我需要dd / MM / yyyy)。

自定义的modelbinder在application_start()b / c中调用,我不知道在哪里。

使用<globalization/>我已经尝试过与culture="ro-RO", uiCulture="ro"等文化,会给我dd / MM / yyyy。 我也试图在application_start()的每个线程的基础上设置它(这里有很多的例子,关于如何做到这一点)


对于所有这些都会读到这个问题:只要我没有客户端validation,Darin Dimitrov的答案似乎就会起作用。 另一种方法是使用自定义validation,包括客户端validation。 我很高兴在重新创build整个应用程序之前发现了这一点。

啊,现在很清楚。 你似乎有问题绑定的价值。 不是在视图上显示它。 事实上,这是默认模型绑定器的缺陷。 你可以写和使用一个自定义的,将考虑到你的模型的[DisplayFormat]属性。 我已经在这里说明了这样一个自定义模型联编程序: https : //stackoverflow.com/a/7836093/29407


显然有些问题仍然存在。 这里是我的完整安装在ASP.NET MVC 3和4 RC上的完美工作。

模型:

 public class MyViewModel { [DisplayName("date of birth")] [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] public DateTime? Birth { get; set; } } 

控制器:

 public class HomeController : Controller { public ActionResult Index() { return View(new MyViewModel { Birth = DateTime.Now }); } [HttpPost] public ActionResult Index(MyViewModel model) { return View(model); } } 

视图:

 @model MyViewModel @using (Html.BeginForm()) { @Html.LabelFor(x => x.Birth) @Html.EditorFor(x => x.Birth) @Html.ValidationMessageFor(x => x.Birth) <button type="submit">OK</button> } 

自定义模型联编Application_StartApplication_Start

 ModelBinders.Binders.Add(typeof(DateTime?), new MyDateTimeModelBinder()); 

而自定义模型联编程序本身:

 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); } } 

现在,无论您在web.config( <globalization>元素)或当前线程文化中设置了哪种文化,自定义模型联编程序在分析可空date时都将使用DisplayFormat属性的date格式。

感谢达林,对我来说,能够发布到创build方法,它只工作后,我修改了BindModel代码:

 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.TryParse(value.AttemptedValue, CultureInfo.GetCultureInfo("en-GB"), 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); } 

希望这可以帮助别人…

客户端validation问题可能会发生,因为MVC错误(即使在MVC 5)在jquery.validate.unobtrusive.min.js 不接受date/date时间格式的任何方式 。 不幸的是,你必须手动解决它。

我最后的工作解决scheme

 $(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