【问题标题】:WEB API validation class using attributes使用属性的WEB API验证类
【发布时间】:2020-11-04 08:28:25
【问题描述】:

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

【问题讨论】:

  • 您在控制器中尝试过“ModelState.IsValid”吗?你能附上控制器和模型代码吗?
  • 这个想法是在控制器之外的代理中间件中使用它,其中只存储模型和验证。如果可能,我不想编辑控制器,因为它是下一层,如果验证失败,则不应访问。

标签: c# .net validation asp.net-core attributes


【解决方案1】:

我可以发誓,前段时间我能够调试它并进入 Validation 类,但现在看来这只是关于一些客户端验证,它不会在后端中间件中验证。

确保您的剃刀视图没有添加jquery.validate.min.jsjquery.validate.unobtrusive.min.js

对于使用 asp.net core 默认模板,您可以在您的 razor 视图中避免使用以下代码:

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

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

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

更新:

如果您想在控制器之前进行验证,我建议您可以自定义 ActionFilter。这是一个使用 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());
});

结果:

【讨论】:

  • 谢谢,但我没有任何意见 - 它是一个 API :) 就像我在上面写的 - 这是通过或不通过请求的代理验证层。
  • 是的!谢谢,效果很好 :) 这是完成这项工作的最聪明、最干净的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 2017-01-30
  • 1970-01-01
相关资源
最近更新 更多