Я искал в Google целый день и не могу найти ответа: проблема в том, чтобы проверить класс с атрибутами, когда я создаю класс. Итак: я прочитал тело запроса POST, и каждое поле должно быть проверено. Он десериализован из Json в класс Request. Тогда у этого класса есть свои требования. Можно ли это сделать в ядре asp.net с помощью атрибутов? Насколько мне известно, есть 2 способа проверить класс: с помощью ValidationAttribute и наследования атрибутов. Я мог бы поклясться, что некоторое время назад мне удалось отладить его и перейти в класс проверки, но теперь кажется, что это касается только некоторой проверки клиента и не проверяется в промежуточном программном обеспечении серверной части. Последнее, что я пробую, - это использовать Validator.TryValidateObject. Это лучший вариант?
Класс проверки WEB API с использованием атрибутов
Ответы (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());
});