Класс проверки WEB API с использованием атрибутов

Я искал в Google целый день и не могу найти ответа: проблема в том, чтобы проверить класс с атрибутами, когда я создаю класс. Итак: я прочитал тело запроса POST, и каждое поле должно быть проверено. Он десериализован из Json в класс Request. Тогда у этого класса есть свои требования. Можно ли это сделать в ядре asp.net с помощью атрибутов? Насколько мне известно, есть 2 способа проверить класс: с помощью ValidationAttribute и наследования атрибутов. Я мог бы поклясться, что некоторое время назад мне удалось отладить его и перейти в класс проверки, но теперь кажется, что это касается только некоторой проверки клиента и не проверяется в промежуточном программном обеспечении серверной части. Последнее, что я пробую, - это использовать Validator.TryValidateObject. Это лучший вариант?


person Paweł Stolka    schedule 14.07.2020    source источник
comment
вы пробовали ModelState.IsValid в своем контроллере? Не могли бы вы также прикрепить код контроллера и модели?   -  person ddfra    schedule 15.07.2020
comment
Идея состоит в том, чтобы использовать его вне контроллера, в промежуточном программном обеспечении прокси, где хранятся только модель и проверка. Я не хочу редактировать контроллер, если это возможно, так как это следующий уровень, который не должен быть доступен, если проверка не удалась.   -  person Paweł Stolka    schedule 15.07.2020


Ответы (1)


Я мог бы поклясться, что некоторое время назад мне удалось отладить его и перейти в класс проверки, но теперь кажется, что это касается только некоторой проверки клиента и не проверяется в промежуточном программном обеспечении серверной части.

Убедитесь, что ваша бритва не добавляет jquery.validate.min.js и jquery.validate.unobtrusive.min.js.

Для использования основного шаблона asp.net по умолчанию вы можете просто избежать использования следующего кода в своем представлении бритвы:

@*@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}*@

Затем добавьте в свой бэкэнд следующий код:

if (!ModelState.IsValid)  
{
    return View(model);
}

Обновление:

Если вы хотите проверить перед контроллером, я предлагаю вам настроить ActionFilter. Вот рабочая демонстрация с веб-api asp.net core 3.1:

Модель:

public class Test
{
    [Range(1,4)]
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
}

Пользовательский ActionFilter:

public class ValidationFilter : IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext context)
    {
    }

    public void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            context.Result = new JsonResult(context.ModelState.Select(m=>m.Value).ToList())
            {
                StatusCode = 400
            };
        }
    }
}

Контроллер:

[Route("api/[controller]")]
public class ValuesController : ControllerBase
{
    // POST api/<controller>
    [HttpPost]
    public void Post(Test test)
    {

    }
}

Зарегистрируйтесь в Startup.cs:

services.AddControllers(config =>
{
    config.Filters.Add(new ValidationFilter());
});

Результат:  введите описание изображения здесь

person Rena    schedule 15.07.2020
comment
Спасибо, но у меня нет представлений - это API :) Как я уже писал выше - это уровень проверки прокси, который передает запрос или нет. - person Paweł Stolka; 15.07.2020
comment
Да! Спасибо, это отлично работает :) Это самый умный и чистый способ для этой работы. - person Paweł Stolka; 15.07.2020