C# 模型状态错误过滤器
在我的DTO对象上,我有几个属性来检查它的有效性 当验证失败时,我捕捉到这样的身体反应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
{
"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对标记助手有相同的要求,并使用相同的方法在视图中构建错误通知消息。很高兴它帮助了你。快乐编码。