Blazor:不使用@bind-Value时EditContext下自定义下拉组件异常
Blazor自定义Dropdown组件绑定问题
现状说明
自定义Dropdown组件支持通用For参数与@bind-Value绑定,在EditContext场景下,验证不通过时会自动添加invalid CSS类标记,使用@bind-Value时该功能完全正常。
问题描述
当需要单独监听ValueChanged事件回调、放弃@bind-Value自动绑定时,组件无法正常工作。
代码示例
正常工作的写法
<!-- 可以正常工作 --> <DataRowDropDownComponent Values="_productTypes.Select(gg => gg.Label)" @bind-Value="ArticleEntity.ProductType" For="() => ArticleEntity.ProductType"></DataRowDropDownComponent>
无法正常工作的写法
<!-- 无法正常工作 --> <DataRowDropDownComponent Values="_goodsGroups.Select(gg => gg.Label)" Value="ArticleEntity.GoodsGroup" For="() => ArticleEntity.GoodsGroup" T="string" ValueChanged="GoodsGroupChanged"></DataRowDropDownComponent>
排查结果
问题根源是类型为FieldIdentifier的_fieldidentifier变量为空,触发如下异常:
Error: System.ArgumentNullException: Value cannot be null. (Parameter 'obj') at System.OrdinalCaseSensitiveComparer.GetHashCode(String obj) at Microsoft.AspNetCore.Components.Forms.FieldIdentifier.GetHashCode() at System.Collections.Generic.Dictionary2...
该组件继承自通用组件基类,其他同类型Input组件使用相同模式可正常运行,目前缺失@bind-Value与FieldIdentifier协同工作的关键逻辑信息。
补充代码:GoodsGroupChanged方法实现
public async Task GoodsGroupChanged(string val) { if(ArticleEntity is not null && val is not null) { var value = val.ToString() + ""; GetAndSetNavigation(value, NavigationTypes.GoodsGroup); await LoadProductGroups(value); } } public void GetAndSetNavigation(string label, NavigationTypes navType) { if(ArticleEntity?.Entity is AssortmentArticle aa) { aa.Navigation = navType switch { NavigationTypes.ProductGroup => _productGroups.Find(n => n.Label == label), NavigationTypes.GoodsGroup => _goodsGroups.Find(n => n.Label == label), NavigationTypes.ProductType => null, _ => null }; } } private async Task LoadProductGroups(string label) { // 业务逻辑暂不公开 --> 为另一个组件设置_productType列表 }
内容的提问来源于stack exchange,提问作者Patrick Cerny
相关产品推荐
相关产品推荐

