ISO 8601準拠のDateTime Model Binderのコードを含む Gist を Google で見つけ、次のように変更しました。
public class DateTimeBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var name = bindingContext.ModelName;
var value = bindingContext.ValueProvider.GetValue(name);
if (value == null)
return null;
DateTime date;
if (DateTime.TryParse(value.AttemptedValue, null, DateTimeStyles.RoundtripKind, out date))
return date;
else
return base.BindModel(controllerContext, bindingContext);
}
}
Gist コードは制限が厳しすぎると思います。秒の小数点以下 6 桁が必要です。そうしないと、タイムスタンプが受け入れられません。これは TryParseExact の代わりに TryParse を使用するため、技術的に多くのタイムスタンプ タイプを受け入れます。重要な部分は、DateTimeStyles.RoundtripKind を使用して、Z によって暗示されるタイム ゾーンを尊重することです。そのため、これは技術的には ISO 8601 固有の実装ではなくなりました。
次に、モデル バインダー属性または App_Start のこのスニペットを使用して、これを MVC パイプラインにフックできます。
var dateTimeBinder = new DateTimeBinder();
ModelBinders.Binders.Add(typeof(DateTime), dateTimeBinder);
ModelBinders.Binders.Add(typeof(DateTime?), dateTimeBinder);