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
如果我在没有查询参数的情况下调用它,After
和 Duration
将为空。
如果我让它们不可为空,我会收到验证错误。
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"
]
}
如果请求中省略了 After
和 Duration
默认值,是否有简单的方法来设置它们?
感谢 ,我设法用 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>();
});
总结
如果在请求中省略默认值,是否可以设置默认值?
详情
我有一个定义默认值的查询参数模型。但是,当请求中省略查询参数时,不会设置默认值。
请求是这样定义的
[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
如果我在没有查询参数的情况下调用它,After
和 Duration
将为空。
如果我让它们不可为空,我会收到验证错误。
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"
]
}
如果请求中省略了 After
和 Duration
默认值,是否有简单的方法来设置它们?
感谢 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>();
});