ASP.NET Core Web API 验证错误处理

6

我正在尝试在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并将其附加到控制器操作上,如此处所述,但是设置断点时,由于DateLessThanAttribute首先返回响应,因此ActionFilterAttribute从未运行。我是否忽略了这些筛选器的顺序或者我只是实现有误?

你所说的“模型从未进入控制器”是什么意思?你是如何测试你的应用程序的? - Alfredo A.
1个回答

8

您需要禁用自动模型状态验证。您可以通过将以下代码添加到您的 startup.cs 中来实现:

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

我认为你指的是 ASP .Net Core。在我看来,这个问题与 ASP .Net 有关。 - Alfredo A.
可以的。如果是这种情况,我会删除答案。 - Danijel
1
这是一个 .Net Core 应用程序,抱歉我没有说清楚!添加这个对我来说完美地解决了问题,谢谢。只是希望我能在某个地方更明确地找到它的说明.. - Ben
@Danijel,你正在禁用默认行为,只是为了让你的代码工作,这将导致每个“ActionMethod”中都有重复。 - Voodoo
@Voodoo 应用过滤器也是“我们必须编写的代码”。无论是过滤器还是一些常见服务,都应该将代码放在一个地方。我们通过BaseController进行处理,并调用validationService.ValidateModelState,然后进行所有繁重的工作。此外,这个讨论不是OP所问的问题,所以... - Danijel
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接