ASP.NET Core Webapi (3.x) 自定义 ModelBinder 总是返回空对象

问题描述

我一直在尝试创建自定义模型活页夹,但遇到了一个问题,即通过活页夹后的对象始终为空。

我有充分的理由使用自定义模型绑定器。出于这个问题的目的,假设我必须使用自定义模型绑定器。在我使用带有库存或自定义模型绑定器的自定义绑定器提供程序的每种情况下,我都遇到了这个问题,所以我已经把它简化了很多来演示,但它也发生在这个特定的例子中,我真的需要知道为什么。

我有一个简单的控制器操作和 DTO 类:

    [HttpPost]
    [Route("{id}")]
    public async Task<ActionResult<QueryServicesDto>> UpdateQueryService(int id,[FromBody] QueryServicesDtoLight dto)
    {
    }

  public class QueryServicesDtoLight
  {

    public long QueryServicesId { get; set; }
    public DateTime? CreationDate { get; set; }
    public long? ModifiedDate { get; set; }
    public long? PropagationDate { get; set; }
    public int? CabinetListNumber { get; set; }

    public string GameCode { get; set; }
    
    public string Status { get; set; }

  }

谁能告诉我为什么在没有自定义绑定器提供者的情况下将有效的 JSON 发布到此操作时,我会得到一个具有正确值的 DTO,但是如果我在下面注入自定义 modelBinderProvider,我会得到一个没有值的新模型?

     public class QueryServiceModelBinderBinderProvider : IModelBinderProvider
    {
        
        

        public IModelBinder GetBinder(ModelBinderProviderContext context)
        {
            if (context.Metadata.ModelType== typeof(QueryServicesDtoLight))
            {
                var propertyBinders = new Dictionary<ModelMetadata,IModelBinder>();
                for (var i = 0; i < context.Metadata.Properties.Count; i++)
                {
                    ModelMetadata theProp = context.Metadata.Properties[i];
                    var binder = context.CreateBinder(theProp);
                    propertyBinders.Add(theProp,binder);
            
                }
                var loggerFactory = context.Services.GetrequiredService<ILoggerFactory>();
                return new ComplexTypeModelBinder(propertyBinders,loggerFactory);
            }
           
            else
            {
                return null;
            }
          
        }
    }

Binder provider 是这样添加的::

 services.AddControllersWithViews(o=>o.ModelBinderProviders.Insert(0,new QueryServiceModelBinderBinderProvider())).AddNewtonsoftJson();

示例 JSON 数据

{"queryServicesId":14,"creationDate":"2021-03-08T17:06:36.053","modifiedDate":16176433093000000,"propagationDate":0,"cabinetListNumber":996,"gameCode":"PGA2006","status":"AC"}

解决方法

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

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

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