使用属性的 WEB API 验证 class

WEB API validation class using attributes

我一直在搜索 google 一整天,但找不到答案: 问题是在我创建 class 时用属性验证 class。 事情是这样的:我读了一个 POST 请求正文,每个字段都应该被验证。 它从 Json 反序列化为 Request class。那么这个class就有它的要求。 是否可以使用属性在 asp.net 核心中执行此操作? 据我所知,有两种方法可以检查 class:使用 ValidationAttribute 和 Attribute 继承。 我可以发誓,前段时间我能够调试它并转到验证 class,但现在似乎只涉及一些客户端验证,它不会在后端中间件中验证。 我尝试的最后一件事是使用 Validator.TryValidateObject。 这是更好的选择吗?

I could swear that some time ago I was able to debug it and go to Validation class, but now it seems that is only regarding some client validation and it does not validate in backend middleware.

请确保您的剃刀视图不会添加 jquery.validate.min.jsjquery.validate.unobtrusive.min.js

要使用 asp.net 核心默认模板,您可以 避免 在 razor 视图中使用以下代码:

@*@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}*@

然后将以下代码添加到您的后端:

if (!ModelState.IsValid)  
{
    return View(model);
}

更新:

如果你想在控制器之前验证,我建议你可以自定义 ActionFilter.Here 是一个工作演示 asp.net core 3.1 web api:

型号:

public class Test
{
    [Range(1,4)]
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
}

自定义动作过滤器:

public class ValidationFilter : IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext context)
    {
    }

    public void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            context.Result = new JsonResult(context.ModelState.Select(m=>m.Value).ToList())
            {
                StatusCode = 400
            };
        }
    }
}

控制器:

[Route("api/[controller]")]
public class ValuesController : ControllerBase
{
    // POST api/<controller>
    [HttpPost]
    public void Post(Test test)
    {

    }
}

在Startup.cs注册:

services.AddControllers(config =>
{
    config.Filters.Add(new ValidationFilter());
});

结果: