Blazor中MudAutocomplete为空点击确认报错的解决方案问询
解决MudAutocomplete空对象导致的按钮点击错误问题
要解决这个问题,核心是直接判断绑定的elemecik对象是否为空,同时结合MudAutocomplete的验证状态来控制按钮禁用,具体操作如下:
1. 控制按钮禁用状态
将确认按钮的Disabled属性修改为判断elemecik是否为空,再结合组件的验证状态,确保只有选择了有效选项时按钮才可用:
<MudButton Variant="Variant.Filled" StartIcon="@Icons.Material.Filled.Save" Color="Color.Primary" OnClick="Replace" Disabled="@(elemecik == null || !RefEntryField.IsValid)">Zamień</MudButton>
elemecik == null:直接判断绑定的对象是否为空,没有选择匹配项时elemecik会保持null!RefEntryField.IsValid:结合组件的Required验证,确保输入框符合必填要求
2. 给Replace方法加空判断(双重保险)
即使按钮禁用被绕过,在执行核心逻辑前先检查elemecik是否为空,避免空引用错误:
private async Task Replace() { if (elemecik == null) return; // 空对象直接返回,不执行后续逻辑 oS.UPDATEReplace(srcdoc, id, elemecik.Nazwa_ERPXL, elemecik.indeks_compApps, elemecik.jednostka_compApps, elemecik.ilosc_compApps, elemecik.gid_numer_compApps, elemecik.magazyn, elemecik.regal, elemecik.polka, elemecik.indeks_compApps,tmp_elemecik.indeks_compApps); Submit(); }
完整修改后的代码片段
Razor部分
<MudDialog> <DialogContent> <MudItem > <MudPaper Class="pa-4"> <MudAutocomplete Required="true" RequiredError="Pole muis być uzupełnione!" @ref="RefEntryField" T="OptymalizationModels" Label="Indeks - Nazwa Towaru" @bind-Value="elemecik" SearchFunc="@Search2" ToStringFunc="@(e=> e==null?null : $"{e.indeks_compApps} - {e.Nazwa_ERPXL}")" ShowProgressIndicator="true" ProgressIndicatorColor="Color.Default" CoerceText="true" ResetValueOnEmptyText="false" /> </MudPaper> </MudItem> </DialogContent> <DialogActions> <MudButton Variant="Variant.Filled" Color="Color.Error" OnClick="Cancel">Anuluj</MudButton> <MudButton Variant="Variant.Filled" StartIcon="@Icons.Material.Filled.Save" Color="Color.Primary" OnClick="Replace" Disabled="@(elemecik == null || !RefEntryField.IsValid)">Zamień</MudButton> </DialogActions> </MudDialog>
C#代码部分
IEnumerable<OptymalizationModels> lista; OptymalizationModels elemecik; OptymalizationModels tmp_elemecik; [CascadingParameter] MudDialogInstance MudDialog { get; set; } [Parameter] public int id { get; set; } [Parameter] public int srcdoc { get; set; } private MudAutocomplete<OptymalizationModels> RefEntryField; protected override async Task OnInitializedAsync() { tmp_elemecik = new OptymalizationModels(); lista = await Task.Run(() => oS.GetListOkucInWarehouse()); tmp_elemecik = await Task.Run(() => oS.GetONEOkucia(srcdoc, id)); } private async Task<IEnumerable<OptymalizationModels>> Search2(string value) { await Task.Delay(1000); if (string.IsNullOrEmpty(value)) return lista; return lista.Where(x => x.Nazwa_ERPXL.Contains(value, StringComparison.InvariantCultureIgnoreCase) || x.indeks_compApps.Contains(value, StringComparison.InvariantCultureIgnoreCase)); } void Submit() => MudDialog.Close(DialogResult.Ok(true)); void Cancel() => MudDialog.Cancel(); protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { await RefEntryField.FocusAsync(); } } private async Task Replace() { if (elemecik == null) return; oS.UPDATEReplace(srcdoc, id, elemecik.Nazwa_ERPXL, elemecik.indeks_compApps, elemecik.jednostka_compApps, elemecik.ilosc_compApps, elemecik.gid_numer_compApps, elemecik.magazyn, elemecik.regal, elemecik.polka, elemecik.indeks_compApps,tmp_elemecik.indeks_compApps); Submit(); }
这样修改后,当用户没有选择任何匹配项时,elemecik会保持null,按钮会被禁用,同时Replace方法里的空判断也能防止意外的空引用错误。
内容的提问来源于stack exchange,提问作者Przemo
相关产品推荐
相关产品推荐

