MVC3がDateTimeに提供するデフォルトのエディターはHTML5に対応していないため、次のカスタムエディターテンプレートをコーディングしました。
(DateTime.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());
ただし、カスタム編集テンプレートが配置されている場合、カスタムバインダーはまったく呼び出されません。私はそれをソリューションから削除し、カスタムバインダーは正しく呼び出されましたが、その時点では、カスタムエディターが正しいコントロールを提供していなかったため、形式が間違っています。
だから、私は何が欠けていますか?