Я использовал net core 3.1 в своем проекте веб-API. Чтобы принять даты в формате dd-MM-гггг от пользователя в теле запроса JSON, я создал преобразователь DateTime, который преобразует все входящие и исходящие даты в указанный формат.
Ниже представлен мой конвертер DateTime:
public class DateTimeConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
Debug.Assert(typeToConvert == typeof(DateTime));
return DateTime.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("dd-MM-yyyy hh:mm tt"));
}
}
И я зарегистрировал то же самое в файле startup.cs, например:
services.AddControllers(options =>
{
//To accept browser headers.
options.RespectBrowserAcceptHeader = true;
}).
AddNewtonsoftJson(options =>
{
// Use the default property (Pascal) casing
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
}).
AddJsonOptions(options =>
{
//converter to accept date in particular(dd-MM-yyyy) format
options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
});
Теперь я сталкиваюсь с некоторыми проблемами в конвертере DateTime. Я создал фильтр действий для проверки ошибок ModelState, которые вызываются после возникновения исключения из конвертера DateTime. Ниже приведен фильтр ошибок ModelState:
public override void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
ApiResponseModel<IEnumerable<ValidationErrorModel>> apiResponseModel = new ApiResponseModel<IEnumerable<ValidationErrorModel>>();
apiResponseModel.ResponseCode = (int)HttpStatusCode.BadRequest;
apiResponseModel.ResponseMessage = string.Join(" ",
context.ModelState.Values.Where(E => E.Errors.Count > 0)
.SelectMany(E => E.Errors)
.Select(E => E.ErrorMessage)
.ToArray());
apiResponseModel.ResponseData = null;
context.Result = new OkObjectResult(apiResponseModel);
}
}
Когда дата имеет неправильный формат, например, в формате MM-dd-YYYY, она генерирует ошибку ModelState и выдает свое встроенное сообщение об ошибке как «Предоставленное значение». является недействительным". Я хотел отобразить другое сообщение вместо этого встроенного сообщения, что-то вроде «{nameofdatetimefield} не в правильном формате». Итак, как я могу добиться того же внутри этого DateTimeConverter .?