我正在使用带有Razor的ASP.NET MVC 4。我收到验证消息(假设我的文本框中有20.10.2013):
The field MyNullableDateField must be a date
我的型号代码:
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}", ApplyFormatInEditMode = true)]
public DateTime? MyNullableDateField { get; set; }
我的剃刀:
@Html.EditorFor(m => m.MyNullableDateField, new { @class = "date" })
我的编辑器模板:
@model DateTime?
@Html.TextBox(string.Empty, (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty), new { @class = "date" })
为什么我会收到这样的错误?
答案 0 :(得分:2)
安德烈,
显示格式主要用于使用您在视图上使用的Html帮助程序。
您需要的是(正如@CodeCaster正确提到的)是DateTime类型的自定义模型绑定器。可以按类型注册自定义模型绑定器,因此每当MVC运行时在相同类型的控制器操作上看到参数时,它将调用自定义模型绑定器以正确解释发布的值并创建类型,
以下是DateTime
的示例自定义模型活页夹类型public class DateTimeModelBinder : DefaultModelBinder
{
private string _customFormat;
public DateTimeModelBinder(string customFormat)
{
_customFormat = customFormat;
}
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
// use correct fromatting to format the value
return DateTime.ParseExact(value.AttemptedValue, _customFormat, CultureInfo.InvariantCulture);
}
}
现在,您必须告诉MVC将新模型绑定器用于DateTime。您可以通过在Application_Start
中注册新的模型绑定器来完成此操作protected void Application_Start()
{
//tell MVC all about your new custom model binder
var binder = new DateTimeModelBinder("dd.MM.yyyy");
ModelBinders.Binders.Add(typeof(DateTime), binder);
ModelBinders.Binders.Add(typeof(DateTime?), binder);
}
关于日期时间(http://blog.greatrexpectations.com/2013/01/10/custom-date-formats-and-the-mvc-model-binder/)
的自定义模型绑定这篇优秀文章希望这有助于您开始正确的部分