Обработка ошибок проверки веб-API ASP.NET Core - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь вернуть объект пользовательского ответа, когда модель не проходит проверку в моем проекте Web API. Я прикрепил атрибуты к модели следующим образом:

  public class DateLessThanAttribute : ValidationAttribute
  {
    private readonly string _comparisonProperty;

    public DateLessThanAttribute(string comparisonProperty)
    {
      _comparisonProperty = comparisonProperty;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
      ErrorMessage = ErrorMessageString;
      var currentValue = (DateTime)value;

      var property = validationContext.ObjectType.GetProperty(_comparisonProperty);

      if (property == null)
        throw new ArgumentException("Property with this name not found");

      var comparisonValue = (DateTime)property.GetValue(validationContext.ObjectInstance);

      if (currentValue > comparisonValue)
        return new ValidationResult(ErrorMessage);

      return ValidationResult.Success;
    }
  }

На модели:

[DateLessThan("EndDate", ErrorMessage = "StartDate must be less than EndDate")]
public DateTime StartDate { get; set; }

И контроллер:

public void PostCostingStandard(CostStandardRequest request)
{
  CostResult costResult;
  if (ModelState.IsValid)
  {
    // work
  }
  else
  {
    // return bad costResult object
  }
}

Тем не менее, модель внутри контроллера никогда не достигает значения ModelState.IsValid. Я попытался создать ActionFilterAttribute и прикрепить его к своему действию контроллера, как указано здесь , но при установке точки останова ActionFilterAttribute никогда не запускается, потому что DateLessThanAttribute сначала возвращает ответ. Есть ли порядок в этих фильтрах, который я пропустил или я просто что-то неправильно реализовал?

1 Ответ

0 голосов
/ 06 ноября 2018

Вы должны отключить автоматическую проверку состояния модели. Вы можете сделать это, добавив следующий код в startup.cs

services.Configure<ApiBehaviorOptions>(options =>
{
    options.SuppressModelStateInvalidFilter = true;
});
...