You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:46:22