ASP.NET Core MVC имеет отличную подсистему привязки и проверки модели, которая поддерживает практически любой сценарий. Но при разработке 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свойство. Но все, что вы можете сделать, это обрабатывать сообщения об ошибках, которые являются чистыми строками! Это может привести к некоторым проблемам.Я ценю любые другие решения.
Решение проблемы
Для общего сообщения проверки это чистая строка. И для 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 attr = prop.GetCustomAttributes(typeof(ValidationAttribute), false).FirstOrDefault() as ValidationAttribute;
if (attr is MinLengthAttribute minLengthAttribute)
{
error.Add("Error", "minLength");
error.Add("Property", key);
error.Add("minimum", minLengthAttribute.Length.ToString());
}
}
}
}
return new BadRequestObjectResult(error);
};
});
Комментариев нет:
Отправить комментарий