如何解决FromQueryAttribute 和 ModelBinderAttribute 顺序重要吗?
我完全不明白属性顺序很重要。
我有这样的课
public class PaginatedFilter<TFilter> where TFilter : class
{
[FromBody] public TFilter Filter { get; set; }
[FromQuery]
[ModelBinder(BinderType = typeof(FilterBinder))]
public PaginationFilter PaginationFilter { get; set; } = new();
}
这是 PaginationFilter 记录
public record PaginationFilter
{
private int _pageNumber = 1;
private int _pageSize = 100;
[FromQuery(Name = nameof(PageNumber))]
public int PageNumber
{
get => _pageNumber < 1 ? 1 : _pageNumber;
set => _pageNumber = value;
}
[FromQuery(Name = nameof(PageSize))]
public int PageSize
{
get => _pageSize > 100 ? 100 : _pageSize;
set => _pageSize = value;
}
}
我的自定义活页夹
public class FilterBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var model = Activator.CreateInstance(bindingContext.ModelType);
var mainObjectProperties = bindingContext.ModelType.GetProperties();
foreach (var paginationFilterProp in mainObjectProperties)
{
var converter = TypeDescriptor.GetConverter(paginationFilterProp.PropertyType);
var valueProviderResult = bindingContext.ValueProvider.GetValue(paginationFilterProp.Name).FirstValue;
if (valueProviderResult == null) continue;
paginationFilterProp.SetValue(model,converter.ConvertFrom(valueProviderResult));
}
bindingContext.Result = ModelBindingResult.Success(model);
return Task.CompletedTask;
}
}
我以这种方式在控制器中使用:
[HttpPost]
public async Task<PagedResponse<IEnumerable<VantageJobDto>>> GetVantageJobByFilter([FromQuery] PaginatedFilter<VantageJobFilter> paginatedFilter)
{
return await Mediator.Send(new GetVantageJobsByFilterQuery(paginatedFilter));
}
哪个完美
但是,当我像这样在 PaginatedFilter 类中更改属性顺序时
public class PaginatedFilter<TFilter> where TFilter : class
{
[FromBody] public TFilter Filter { get; set; }
>[ModelBinder(BinderType = typeof(FilterBinder))]
>[FromQuery]
public PaginationFilter PaginationFilter { get; set; } = new();
}
Swagger 显示出奇怪的结果
有人可以解释一下,为什么会发生这种情况以及发生了什么?我怀疑首先启动代码正在改变顺序,但我不明白。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。