【问题标题】:Asp.Net Core 5 [FromQuery] default value in model bindingsAsp.Net Core 5 [FromQuery] 模型绑定中的默认值
【发布时间】:2021-11-28 04:52:38
【问题描述】:

总结

如果请求中省略了默认值,有没有办法设置它们?

详情

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

请求是这样定义的

[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 默认值,是否有一种简单的方法来设置它们?

【问题讨论】:

    标签: asp.net-core default-value


    【解决方案1】:

    感谢How to automatically set default value of API model's property with value from appSettings.json?,我设法通过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>();
    });
    

    【讨论】:

      猜你喜欢
      • 2019-03-16
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多