NetCore中的模型验证返回的格式默认是系统自定义的,比如我们定义一个模型类:
public class Student{
public int Id {get;set;}
[MinLength(2,ErrorMessage ="姓名最小长度为2")]
public string Name{get;set;}
}
当我们给某个控制器传入的参数是Student的Json数据且Name属性传入的值长度小于2时,NetCore会自动返回模型验证失败,且格式往往是这样的:
那么有没有办法统一定义整个api返回的数据格式呢,答案是有的,第一种方式是使用过滤器,IActionFilter动作过滤器可以 第二种方式是使用异常中间件,但是异常中间件是无法定义模型的返回格式的,因为这里的模型验证失败的错误是在Controller中间件中处理的,其他中间件无法得到,那么有没有方法只针对模型错误的返回格式进行定义呢,答案是有的,这里作者就找到了方式方法,代码如下:
builder.Services.AddControllers(options =>
{
options.Filters.Add<HttpResponseExceptionFilter>();
}).ConfigureApiBehaviorOptions(options => {
options.InvalidModelStateResponseFactory = context =>
{
var msg = "";
foreach (var item in context.ModelState)
{
msg += item.Key;
msg += ":" + item.Value.Errors[0].ErrorMessage;
break;
}
var rst = new Result()
{
Code = "-99",
Message = msg
};
return new BadRequestObjectResult(rst)
{
ContentTypes =
{
// using static System.Net.Mime.MediaTypeNames;
Application.Json,
Application.Xml
}
};
};
}).AddXmlSerializerFormatters();
这里Result即是我们自己定义的返回结构体,且支持以Json和Xml的格式返回响应,这取决于你的请求头是什么格式的。