【问题标题】:Validate a model with filter Attribute使用过滤器属性验证模型
【发布时间】:2019-11-12 06:27:40
【问题描述】:

出于 DRY 的原因,我正在练习属性中的验证,但我得到了一些 Web Api 的示例,我不知道是否有办法返回带有无效数据和模型状态错误的视图,而不是 API 中使用的 BadRequestObjectResult。

我已经阅读了有关它的官方文档,但我不明白它在视图的情况下是如何实现的。

我正在使用具有 2 个输入的基本模型在 EF Core 实体中添加数据以测试此属性过滤器。我的目标是为这个案例获得一些通用的东西,因为我对 Web Api 理解它。

提前感谢您能给我的任何帮助。

我想在 IActionResult 中更改它:

if(!ModelState.IsValid)
    return View(ModelState)

类似这样的属性类:

public class ValidateModelAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            // I know that this line indicates a BadRequestObjectResult
            // but I don't know how to returning like view if
            // the Web App use razor pages

            context.Result = new BadRequestObjectResult(context.ModelState);
        }

    base.OnActionExecuting(context);
}

这是示例的实际响应(但我想使用 MVC 页面返回错误和模型数据):

{ "LastName":["The LastName field is required."],"FirstName":["The FirstName"]}

【问题讨论】:

  • 所以不是从控制器发送它,而是要为它创建过滤器?
  • 你确定继承自 ActionFilterAttribute 有意义吗?
  • @Vishalmodi 是的先生,但不要像 BadRequest() 那样返回
  • @JohnB 这是一些网站的示例代码

标签: c# .net-core asp.net-core-2.1 asp.net-mvc-filters


【解决方案1】:

如果您正在创建验证过滤器,则无需在 ValidateModelAttribute 中执行任何操作。您只需要检查ModelState.IsValid,因此它将在全局范围内工作,并且它会返回与您在控制器操作中编写的视图相同的视图。

无需编写任何额外代码,它将返回您的错误视图。

 [ValidateModel]
 public IActionResult Index(Test t)
 {
    return View(t);
 }

public class ValidateModelAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {

        }
        base.OnActionExecuting(context);
    }

}

【讨论】:

  • 我已经发现我的错误了。正如您所说,没有必要添加额外的代码。尽管如有必要,请始终正确返回数据。感谢您的帮助
猜你喜欢
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
相关资源
最近更新 更多