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));
    }

在大摇大摆的表演之后

enter image description here

哪个完美

但是,当我像这样在 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 显示出奇怪的结果

enter image description here

Swagger json 差异:

enter image description here

有人可以解释一下,为什么会发生这种情况以及发生了什么?我怀疑首先启动代码正在改变顺序,但我不明白。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)