Атрибут диапазона проверки модели ASP Net Core игнорируется - PullRequest
0 голосов
/ 10 января 2019

Я использую Microsoft.AspNetCore.Mvc 2.1.3.

В Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddSingleton<ILocationService, LocationService>()
        .AddSingleton(_ => BootStatus.Instantiate())
        .AddScoped<IClock>(_ => new ZonedClock(SystemClock.Instance, DateTimeZone.Utc, CalendarSystem.Iso))
        .AddHostedService<BootService>()
        .AddMvcCore()
        .AddJsonFormatters()
        .AddApiExplorer()
        .AddAuthorization();

    /* Other code, not relevant here. */
}

В моем контроллере HTTP у меня есть GET:

[HttpGet(nameof(Location))]
public async Task<IActionResult> Location(
    LocationQueryParameters queryParams)
{
    if (!ModelState.IsValid)
    {
        return new BadRequestObjectResult(ModelState);
    }

    var response = await locationService.Retrieve(
        queryParams.Category,
        queryParams.ItemsCount);
    return StatusCode(200, response);
}

Вот мой объект параметров:

public class LocationQueryParameters
{
    [FromQuery(Name = "category")]
    [BindRequired]
    public string Category { get; set; }

    [FromQuery(Name = "itemsCount")]
    [BindRequired]
    [Range(1, 999)]
    public int ItemsCount { get; set; }
}

Атрибут Range полностью игнорируется. Аналогично, если я присоединяю атрибут StringLength к свойству string, он игнорируется. Я также попытался написать собственный атрибут ValidationAttribute, но пошаговое выполнение кода никогда не затрагивает метод IsValid. BindRequired и FromQuery работают нормально, так что я делаю не так, что препятствует проверке стиля аннотации данных? Я предпочел бы не писать всю мою проверку вручную.

1 Ответ

0 голосов
/ 11 января 2019

Проблема здесь .AddMvcCore(), то есть голая версия .AddMvc(). Подробнее об этом здесь: https://offering.solutions/blog/articles/2017/02/07/difference-between-addmvc-addmvcore/

Решение состоит в том, чтобы добавить .AddDataAnnotations(), сервис, который обычно добавляется .AddMvc():

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddSingleton<ILocationService, LocationService>()
        .AddSingleton(_ => BootStatus.Instantiate())
        .AddScoped<IClock>(_ => new ZonedClock(SystemClock.Instance, DateTimeZone.Utc, CalendarSystem.Iso))
        .AddHostedService<BootService>()
        .AddMvcCore()
        .AddDataAnnotations()
        .AddJsonFormatters()
        .AddApiExplorer()
        .AddAuthorization();

    /* Other code, not relevant here. */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...