问题描述
我完全不明白属性顺序很重要。
我有这样的课
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 (将#修改为@)