MudBlazor对话框重定向链接为空,NavigateTo报空引用错误求助
问题分析与解决方案
核心问题1:代码执行顺序错误,导航未被阻止
你当前的HandleAppPageMove方法中,break语句写在ctx.PreventNavigation()和StateHasChanged()之前,会直接跳出循环,导致这两行关键代码完全不会执行。页面导航未被阻止,后续对话框的重定向逻辑自然异常。
核心问题2:异步对话框未等待,参数传递可能失败
DialogService.ShowAsync是异步方法,直接调用不使用await会导致对话框初始化不完整,可能造成RedirectLink参数传递失败,最终触发空引用错误。
核心问题3:对话框按钮逻辑顺序错误且无空值校验
Discard方法中先调用NavigateTo再关闭对话框,可能引发组件状态异常;同时未对RedirectLink做空值校验,直接调用会触发空引用错误。
修正后的代码
1. 修复HandleAppPageMove方法
private async ValueTask HandleAppPageMove(LocationChangingContext ctx) { var desiredNavRoute = ctx.TargetLocation; foreach (var item in AnswersByQuestionIds.Values) { if(string.IsNullOrEmpty(item.Answer)) // 改用更严谨的空值判断 { // 先阻止导航 ctx.PreventNavigation(); // 异步等待对话框创建完成,确保参数传递成功 await DialogService.ShowAsync<NotificationDialog>("Invalid Form", new DialogParameters() { { nameof(NotificationDialog.RedirectLink), desiredNavRoute } }, new DialogOptions { NoHeader = true, BackdropClick = false, CloseOnEscapeKey = false }); StateHasChanged(); break; // 最后再跳出循环 } } }
2. 修复Discard方法
private void Discard() { // 先做空值校验,避免空引用 if(!string.IsNullOrEmpty(RedirectLink)) { // 先关闭对话框,再执行导航,保证组件状态正常 MudDialog.Close(DialogResult.Ok(true)); NavManager.NavigateTo(RedirectLink); } }
额外优化建议
- 在
NotificationDialog组件中,确保RedirectLink属性被正确定义为可接收参数的公共属性:
[Parameter] public string RedirectLink { get; set; } = string.Empty;
- 维护一个
IsFormDirty布尔值,当表单内容变更时设为true,统一判断未保存状态,替代遍历每个项的逻辑,让代码更简洁高效。
内容的提问来源于stack exchange,提问作者Troy Bryant
相关产品推荐
相关产品推荐

