Asp.Net Core 5 [FromQuery] 模型绑定中的默认值

Asp.Net Core 5 [FromQuery] default value in model bindings

总结

如果在请求中省略默认值,是否可以设置默认值?

详情

我有一个定义默认值的查询参数模型。但是,当请求中省略查询参数时,不会设置默认值。

请求是这样定义的

[HttpGet("list")]
public async Task<IList<Entry>> GetJsonAsync([FromQuery] Query query)
            => await _store.QueryAsync(query);

和这样的查询

public class Query
{
    public DateTime? After { get; set; } = DateTime.MinValue;
    public TimeSpan? Duration { get; set; } = TimeSpan.MaxValue;
}

请求看起来像这样

http://localhost/api/list?after=2021-10-08T08:35Z&duration=10d
http://localhost/api/list

如果我在没有查询参数的情况下调用它,AfterDuration 将为空。

如果我让它们不可为空,我会收到验证错误。

public class Query
{
    public DateTime After { get; set; } = DateTime.MinValue;
    public TimeSpan Duration { get; set; } = TimeSpan.MaxValue;
}

结果

"errors": {
    "After": [
        "The field must be set"
    ],
    "Duration": [
        "The field must be set"
    ]
}

如果请求中省略了 AfterDuration 默认值,是否有简单的方法来设置它们?

感谢 ,我设法用 IActionFilter 解决了它。

如果有更好的解决方法,请告诉我,如果有更好的方法。

public class InitPassengerCountingQueryFilter : IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext context)
    {

    }

    public void OnActionExecuting(ActionExecutingContext context)
    {
        var q = context.ActionArguments.Values.OfType<Query>().FirstOrDefault();

        if (q != null)
        {
            q.After = q.After ?? DateTime.MinValue;
            q.Duration = q.Duration ?? TimeSpan.MaxValue;
        }
    }
}

services.AddControllers(options =>
{
    options.Filters.Add<InitPassengerCountingQueryFilter>();
});