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

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

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