0

我正在编写一些 .NET core 3.1 WebAPI,虽然模型验证(通过 ValidationAttributes)负责我的大部分请求验证,但请求验证不尊重 DataTypeAttribute。

因此,例如,如果我的端点上有一个小数点属性并且有人提供了一个字符串,那么它在请求验证时会失败,并且我的控制器端点不会被命中。

我知道有几种选择,我只是想知道将请求验证逻辑放在哪里最有意义?

示例:ValidationAttribute(不会触发请求验证)、ActionFilters(OnActionExecuting,会触发)、JsonInputFormatters(也会触发)等...

========== 编辑:==========

谢谢你的回答。我现在正在从 ActionFilterAttribute 创建一个子类 CustomActionFilterAttribute。然后我用这个过滤器属性装饰我的控制器及其动作,但 OnActionExecuting 没有触发。

我尝试过(在 Startup.ConfigureServices() 中):

services.AddScoped\<CustomActionFilterAttribute>();

services.AddControllers(
                config =>
                {
                    config.Filters.Add\<CustomActionFilterAttribute>();
                });

然后我像这样装饰我的控制器:

[ValidateSubUsersModelFilter]
public class MyController : Controller {}

MyController 中的所有操作都不会触发 CustomActionFilterAttribute 的 OnActionExecuting 函数。我在这里错过了什么吗?

4

3 回答 3

1

DataTypeAttribute 不用于验证,但我仍然认为这个问题属于模型验证的标题。你不能在这个属性上添加一个自定义验证器吗?例如(未经测试):

public class DecimalValidator : ValidationAttribute
{
    public override bool IsValid(object value)
    {       
        decimal result;
        return value != null && decimal.TryParse(value.ToString(), out result);
    }
}
于 2020-12-08T19:16:38.383 回答
1

HttpMethods 中的示例

[HttpGet("{id:int}/{year:min(2000)}/{month:range(1,2)})"

或验证过滤器

 public class Validation : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            if (!context.ModelState.IsValid)
            {
               //This is my custom Error Model
                ErrorDTO error = new ErrorDTO();
                error.status = 400;

                var ModelErrors = context.ModelState.Keys.ToList();
                var Errors = context.ModelState.Values.SelectMany(x => x.Errors).ToList();

                for (int i = 0; i < Errors.Count; i++)
                {
                    error.Errors.Add($"{ModelErrors[i]} {Errors[i].ErrorMessage}");
                }

               
                context.Result = new BadRequestObjectResult(error);


            }
        }
    }
于 2020-12-08T19:17:44.113 回答
1

我会在 mvc 设置期间使用流利的验证并设置自动请求验证。这样,如果 body 模型在到达控制器之前实现了验证器,则每个 json 请求都将被验证。

于 2022-02-13T21:55:56.677 回答