ASP.NET Core MVC 有一个很棒的模型绑定(bind)和模型验证子系统,它支持几乎所有场景。但是在开发时 API 事情可能会更复杂一些。
假设我们有一个具有属性 XYZ
的模型类。用 [MinLength(5)]
注释.
public class ViewModel
{
[MinLength(5)]
public string XYZ { get; set; }
}
如果这个属性有什么问题,MVC 会给你这样的东西:
{ "XYZ": [ "The field XYZ must be a string or array type with minimum length of '5'" ] }
但这不是客户需要的!客户需要一个具有特定细节的对象。她将创建自己的信息,但她想:
{ "error": "minLength", "property": "XYZ", "minimum": 5 }
可能的解决方案:
InvalidModelStateResponseFactory
生成自定义响应。它为您提供 ActionContext
其中包含 ModelState
属性(property)。但是您所能做的就是处理纯字符串的错误消息!这可能会导致一些问题。 我很欣赏任何其他解决方案。
最佳答案
对于一般验证消息,它是纯字符串。而对于 minLength
和 minimum
不同的验证属性是不同的。我想知道客户端将如何检查不同的节点。
服务器端,InvalidModelStateResponseFactory
最好返回 json 对象。并且您需要检查 ValidationAttribute 以返回不同的对象,例如
services.Configure<ApiBehaviorOptions>(o =>
{
o.InvalidModelStateResponseFactory = actionContext =>
{
var error = new Dictionary<string, string>();
foreach (var key in actionContext.ModelState.Keys)
{
foreach (var parameter in actionContext.ActionDescriptor.Parameters)
{
var prop = parameter.ParameterType.GetProperty(key);
if (prop != null)
{
var att = prop.GetCustomAttributes(typeof(ValidationAttribute), false).FirstOrDefault() as ValidationAttribute;
if (att is MinLengthAttribute minLengthAttribute)
{
error.Add("Error", "minLength");
error.Add("Property", key);
error.Add("minimum", minLengthAttribute.Length.ToString());
}
}
}
}
return new BadRequestObjectResult(error);
};
});
关于validation - 自定义 ASP.NET Core MVC 验证响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57533976/