Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 模型状态错误过滤器_C#_Asp.net Core_Filter_Asp.net Core Mvc - Fatal编程技术网

C# 模型状态错误过滤器

C# 模型状态错误过滤器,c#,asp.net-core,filter,asp.net-core-mvc,C#,Asp.net Core,Filter,Asp.net Core Mvc,在我的DTO对象上,我有几个属性来检查它的有效性 当验证失败时,我捕捉到这样的身体反应 { "TransactionId": [ "Max length is 20" ], "AdditionalInfo": [ "Additional Info has to be no longer than 30 chars" ] } 但是我需要用“Error”键统一所有的错误。 诸如此类 { "Error": [ "Max length i

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

当验证失败时,我捕捉到这样的身体反应

{
    "TransactionId": [
    "Max length is 20"
    ],
    "AdditionalInfo": [
    "Additional Info has to be no longer than 30 chars"
    ]
}
但是我需要用“Error”键统一所有的错误。 诸如此类

{
    "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

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
将使请求短路,并将自定义响应与所需内容一起传递给它。

您需要提供自己的自定义
IActionResult
或构建所需的对象模型,并将其传递给
ObjectResult
非常感谢。我认为这可以通过上下文来完成。Modelstate@rfedytc对标记助手有相同的要求,并使用相同的方法在视图中构建错误通知消息。很高兴它帮助了你。快乐编码。