Blazor中代码设置属性时EditContext.IsModified()返回false问题
Blazor自动填充字段后EditContext未标记为已修改的问题解决
问题根源
Blazor的EditContext默认仅将用户通过表单输入组件(如InputText)手动交互修改的字段标记为Modified状态。直接通过代码对模型属性赋值(如m.Field2 = DateTime.Now.ToString())只会更新模型值,但不会触发EditContext的修改跟踪逻辑,因此调用IsModified会返回false。
解决方案
方法1:手动调用NotifyFieldChanged通知字段变更
在代码设置字段值后,手动触发EditContext的字段变更通知,让其标记该字段为已修改:
修改Field1Changed方法:
async Task Field1Changed(string value) { m.Field1 = value; await Task.Delay(TimeSpan.FromSeconds(1)); // 模拟异步查询 m.Field2 = DateTime.Now.ToString(); // 生成FieldIdentifier并通知字段变更 var field2Id = form.EditContext.Field(nameof(MyClass.Field2)); form.EditContext.NotifyFieldChanged(field2Id); }
注意:
FieldIdentifier需要传入类的属性名称(nameof(MyClass.Field2)),而非实例属性(nameof(m.Field2)),否则会导致字段匹配失败。
方法2:使用SetFieldValue(推荐)
EditContext提供的SetFieldValue方法会同时完成模型值更新和修改标记设置,是更规范的做法:
async Task Field1Changed(string value) { m.Field1 = value; await Task.Delay(TimeSpan.FromSeconds(1)); // 模拟异步查询 var newField2Value = DateTime.Now.ToString(); // 通过SetFieldValue更新值并标记为已修改 var field2Id = form.EditContext.Field(nameof(MyClass.Field2)); form.EditContext.SetFieldValue(field2Id, newField2Value); }
使用这个方法时,无需手动给m.Field2赋值,SetFieldValue会自动同步模型值。
简化InputText绑定写法
原代码中InputText的写法可以简化为Blazor标准的绑定语法,更简洁易读:
<InputText @bind-Value="m.Field1" @bind-Value:after="async () => await Field1Changed()" />
对应的Field1Changed方法可以去掉参数,直接使用模型的当前值:
async Task Field1Changed() { await Task.Delay(TimeSpan.FromSeconds(1)); // 模拟异步查询 var field2Id = form.EditContext.Field(nameof(MyClass.Field2)); form.EditContext.SetFieldValue(field2Id, DateTime.Now.ToString()); }
验证修改效果
修改后点击check按钮,IsModified(field2Id)会返回true,Field3会显示True,符合预期。
内容的提问来源于stack exchange,提问作者symbiont
相关产品推荐
相关产品推荐

