ASP.NET Core Options绑定字典时空Ids数组对应的键值对未填充问题
问题原因
触发绑定跳过的根因有两个:
ConfigurationData类中的OptionalData是公共字段而非属性,ASP.NET Core配置绑定器默认仅绑定公共可读可写属性,不会扫描字段,因此该成员不会被绑定逻辑识别。- 配置绑定器默认关闭空集合绑定:当子节点下所有可识别属性的配置值都是默认/空值时,绑定器会判定该节点无有效配置,不会实例化对应对象加入字典,因此
KeyA会被直接跳过。
原生解决方案
无需自定义绑定器,按版本选择对应方案即可:
.NET 5 及以上版本
第一步:修正实体类定义
把OptionalData从字段改为公共可读可写属性,让绑定器可识别该成员:
public class ConfigurationData { public HashSet<int> Ids { get; set; } = new HashSet<int>(); // 修改为属性结构 public string OptionalData { get; set; } = ""; }
第二步:调整绑定配置,开启空集合绑定
框架原生提供BinderOptions配置项,开启BindEmptyCollections即可让空集合被正常识别为有效值:
services.Configure<AppConfiguration>(Configuration, options => { // 允许绑定空集合,空数组不会被判定为无效值 options.BindEmptyCollections = true; });
修改完成后KeyA会被正常绑定到字典中,Ids保留初始化的空HashSet<int>,OptionalData保留默认空字符串。
.NET 3.1 及更早版本兼容方案
低版本框架没有BindEmptyCollections配置项,可使用无侵入的兼容方案:在JSON配置的KeyA节点下加一个无业务含义的配置项,让绑定器判定该节点存在有效配置:
"KeyA": { "Ids": [], "__dummy": "1" }
绑定器会自动忽略不存在对应属性的未知配置键,不会影响业务逻辑,同时会正常实例化ConfigurationData对象加入字典。
内容的提问来源于stack exchange,提问作者Kobek
相关产品推荐
相关产品推荐

