GOOGLE ADS

понедельник, 2 мая 2022 г.

Пользовательский ответ проверки ASP.NET Core MVC

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свойство. Но все, что вы можете сделать, это обрабатывать сообщения об ошибках, которые являются чистыми строками! Это может привести к некоторым проблемам.

  • Другой вариант — полностью отключить проверку MVC и реализовать ее самостоятельно.

  • Я ценю любые другие решения.


    Решение проблемы

    Для общего сообщения проверки это чистая строка. И для 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);
    };
    });

    Комментариев нет:

    Отправить комментарий

    Laravel Datatable addColumn returns ID of one record only

    Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...