微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

FromQueryAttribute 和 ModelBinderAttribute 顺序重要吗?

如何解决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 举报,一经查实,本站将立刻删除。