C# 忽略ASP Net核心模型验证范围属性

C# 忽略ASP Net核心模型验证范围属性,c#,validation,asp.net-core,attributes,range,C#,Validation,Asp.net Core,Attributes,Range,我正在使用Microsoft.AspNetCore.Mvc 2.1.3 在Startup.cs中: public void ConfigureServices(IServiceCollection services) { services .AddSingleton<ILocationService, LocationService>() .AddSingleton(_ => BootStatus.Instantiate())

我正在使用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. */
}

范围属性被完全忽略。类似地,如果我将StringLength属性附加到string属性,它将被忽略。我还尝试编写一个自定义ValidationAttribute,但是单步执行代码永远不会碰到IsValid方法。BindRequired和FromQuery工作正常,那么我做错了什么,阻止了数据注释风格的验证呢?我不希望手动编写所有验证。

这里的问题是
.AddMvcCore()
,它是
.AddMvc()
的基本版本。请参见此处的更多信息:

解决方案是添加
.AddDataAnnotations()
,这是一项通常由
.AddMvc()
添加的服务:

public void配置服务(IServiceCollection服务)
{
服务
.AddSingleton()
.AddSingleton(=>BootStatus.Instantiate())
.AddScoped(=>新的分区时钟(SystemClock.Instance、DateTimeZone.Utc、CalendarSystem.Iso))
.AddHostedService()
.AddMvcCore()
.AddDataAnnotations()
.AddJsonFormatters()文件
.AddApiExplorer()
.AddAuthorization();
/*其他代码,此处不相关*/
}

是否有任何演示来重现您的问题?我用你的代码做了一个测试,
Microsoft.AspNetCore.Mvc 2.1.3
,当
https://localhost:44315/location?category=123&itemscount=11111
@TaoZhou我还没有演示,这是一个更大项目的一部分。我会看看我是否能在一个不太复杂的例子中重现它,并更新这篇文章。
[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; }
}
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. */
}