由于 MVC3 为 DateTime 提供的默认编辑器对 HTML5 不友好,因此我编写了以下自定义编辑器模板:
(日期时间.cshtml)
@model DateTime?
<input type="date" value="@{
if (Model.HasValue) {
@Model.Value.ToISOFormat() // my own extension method that will output a string in YYYY-MM-dd format
}
}" />
现在,这工作正常,但后来我遇到了日期没有正确解析的问题,因为 ISO 日期没有使用默认的 DateTime 绑定进行解析。所以,我实现了自己的活页夹:
public class IsoDateModelBinder: DefaultModelBinder
{
const string ISO_DATE_FORMAT = "YYYY-MM-dd";
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (string.IsNullOrEmpty(value.AttemptedValue))
return null;
DateTime date;
if (DateTime.TryParseExact(value.AttemptedValue, ISO_DATE_FORMAT, CultureInfo.InvariantCulture, DateTimeStyles.None, out date));
return date;
return base.BindModel(controllerContext, bindingContext);
}
}
我已经注册了它(Global.asax.cs):
System.Web.Mvc.ModelBinders.Binders.Add(typeof(DateTime), new IsoDateModelBinder());
System.Web.Mvc.ModelBinders.Binders.Add(typeof(DateTime?), new IsoDateModelBinder());
但是,当自定义编辑模板就位时,自定义活页夹根本不会被调用。我已将其从解决方案中删除,并且正确调用了自定义活页夹——尽管此时格式错误,因为自定义编辑器没有提供正确的控件。
那么,我错过了什么?