Change default format for DateTime parsing in ASP.NET Core

前端 未结 10 1216
情话喂你
情话喂你 2021-02-02 08:57

I get a Date in an ASP.NET Core Controller like this:

public class MyController:Controller{
    public IActionResult Test(DateTime date) {

    }
}
10条回答
  •  感动是毒
    2021-02-02 09:51

    Consider using a custom TypeConverter for your datetime (Source):

    using System;
    using System.ComponentModel;
    using System.Globalization;
    using System.Drawing;
    
    public class DeDateTimeConverter : TypeConverter {
       // Overrides the CanConvertFrom method of TypeConverter.
       // The ITypeDescriptorContext interface provides the context for the
       // conversion. Typically, this interface is used at design time to 
       // provide information about the design-time container.
       public override bool CanConvertFrom(ITypeDescriptorContext context, 
          Type sourceType) {
    
          if (sourceType == typeof(string)) {
             return true;
          }
          return base.CanConvertFrom(context, sourceType);
       }
       // Overrides the ConvertFrom method of TypeConverter.
       public override object ConvertFrom(ITypeDescriptorContext context, 
          CultureInfo culture, object value) {
          if (value is string) {
             if (DateTime.TryParse(((string)value), new CultureInfo("de-DE") /*or use culture*/, DateTimeStyles.None, out DateTime date))
                 return date;
          }
          return base.ConvertFrom(context, culture, value);
       }
    }
    

    and use TypeConverter attribute on your property:

    [TypeConverter(typeof(DeDateTimeConverter))]
    public DateTime CustomDateTime { get; set; }
    

    Update

    Based on my experience and thanks to this answer and @zdeněk comment, TypeConverter attribute do not work and you should register TypeConverter in Startup.cs:

    TypeDescriptor.AddAttributes(typeof(DateTime), new TypeConverterAttribute(typeof(DeDateTimeConverter)));
    

提交回复
热议问题