【问题标题】:Model state error filter模型状态错误过滤器
【发布时间】:2018-05-24 08:50:15
【问题描述】:

在我的 DTO 对象上,我有几个属性来检查它的有效性

当验证失败时,我会收到这样的正文响应

{
    "TransactionId": [
    "Max length is 20"
    ],
    "AdditionalInfo": [
    "Additional Info has to be no longer than 30 chars"
    ]
}

但我需要将所有错误统一为“错误”键。 类似的东西

{
    "Error": [
    "Max length is 20",
    "Additional Info has to be no longer than 30 chars"
    ]
} 

我编写了特殊的过滤器并在 Startup.cs 中注册了它

public class ModelStateErrorHandlingFilter : IAsyncActionFilter
{
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {

        if (!context.ModelState.IsValid)
        {
            context.ModelState.SetModelValue("Errors", new ValueProviderResult(new StringValues(context.ModelState.ToString())));
            context.Result = new BadRequestObjectResult(context.ModelState);
        }
        else
        {
            await next().ConfigureAwait(false);
        }
    }
}

但没有任何改变。我也尝试过更改密钥,但它有 privat setter

【问题讨论】:

  • 您需要提供自己的自定义IActionResult 或构建所需的对象模型并将其传递给ObjectResult

标签: c# asp.net-core filter asp.net-core-mvc


【解决方案1】:

您需要提供自己的自定义IActionResult 或构建所需的对象模型并将其传递给适当的ObjectResult

public class ModelStateErrorHandlingFilter : IAsyncActionFilter {
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) {
        if (!context.ModelState.IsValid) {
            var model = new {
                Error = context.ModelState
                    .SelectMany(keyValuePair => keyValuePair.Value.Errors)
                    .Select(modelError => modelError.ErrorMessage)
                    .ToArray()
            };
            context.Result = new BadRequestObjectResult (model);
        } else {
            await next().ConfigureAwait(false);
        }
    }
}

设置context.Result 将使请求短路,并将您的自定义响应传递给它,并包含所需的内容。

【讨论】:

  • 非常感谢。我认为可以使用 context.Modelstate 来完成
  • @rfedytc 对标签助手有相同的要求,并使用相同的方法在视图中构建错误通知消息。很高兴它帮助了你。编码愉快。
猜你喜欢
  • 2021-09-02
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
相关资源
最近更新 更多