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

如何在Blazor/MudBlazor组件间传递激活项ID至对话框

解决MudBlazor TreeView与FeatureDialog动态传参问题

问题核心

直接传参失效、无法处理ActivatedValue动态变化,本质是对话框参数未随TreeView选中节点实时更新,或是传递时机不对。

解决方案1:打开对话框时传递最新选中值

这是最直接的方式,每次打开FeatureDialog时,主动传入当前TreeView激活节点的ID:

父组件(TreeView所在组件)代码调整

  1. 绑定TreeView的激活节点到本地变量:
<MudTreeView @bind-ActivatedValue="_selectedFeatureNode" T="FeatureModel">
    <!-- 你的TreeView节点模板 -->
</MudTreeView>

<MudButton OnClick="OpenFeatureDialog">创建Feature</MudButton>
  1. 在打开对话框的方法中传递最新参数:
private MudTreeViewItem<FeatureModel>? _selectedFeatureNode;
[Inject] private IDialogService DialogService { get; set; }

private async Task OpenFeatureDialog()
{
    // 组装对话框参数,传入当前激活节点的ID(无选中则为null,代表创建父级)
    var dialogParams = new DialogParameters
    {
        ["ParentFeatureId"] = _selectedFeatureNode?.Value // Value对应你的模型ID
    };

    var dialog = DialogService.Show<FeatureDialog>("创建Feature", dialogParams);
    var result = await dialog.Result;

    // 处理对话框返回结果(可选)
    if (!result.Canceled)
    {
        // 刷新TreeView等逻辑
    }
}

FeatureDialog组件代码调整

添加参数接收父级ID,并在参数变化时处理逻辑:

[Parameter]
public int? ParentFeatureId { get; set; }

protected override void OnParametersSet()
{
    // 根据ParentFeatureId判断创建类型
    if (ParentFeatureId.HasValue)
    {
        // 逻辑:创建子级Feature,比如设置表单默认父ID
        Model.ParentId = ParentFeatureId.Value;
    }
    else
    {
        // 逻辑:创建父级Feature,清空父ID
        Model.ParentId = null;
    }
}

解决方案2:实时监听节点变化并更新已打开的对话框

如果需要在对话框已打开的情况下,同步TreeView选中节点的变化,可通过DialogReference更新参数:

父组件代码调整

  1. 绑定节点激活变化事件,保存对话框引用:
<MudTreeView @bind-ActivatedValue="_selectedFeatureNode" 
             ActivatedChanged="OnFeatureNodeActivated">
    <!-- TreeView节点模板 -->
</MudTreeView>
private MudTreeViewItem<FeatureModel>? _selectedFeatureNode;
private DialogReference? _featureDialogRef;
[Inject] private IDialogService DialogService { get; set; }

private async Task OpenFeatureDialog()
{
    var dialogParams = new DialogParameters
    {
        ["ParentFeatureId"] = _selectedFeatureNode?.Value
    };
    _featureDialogRef = DialogService.Show<FeatureDialog>("创建Feature", dialogParams);
    var result = await _featureDialogRef.Result;
    _featureDialogRef = null; // 对话框关闭后清空引用
}

private async void OnFeatureNodeActivated(MudTreeViewItem<FeatureModel> item)
{
    _selectedFeatureNode = item;
    // 如果对话框已打开,更新其参数
    if (_featureDialogRef != null && _featureDialogRef.IsOpen)
    {
        await _featureDialogRef.UpdateParameters(new DialogParameters
        {
            ["ParentFeatureId"] = _selectedFeatureNode?.Value
        });
    }
}

FeatureDialog组件保持不变

依然通过OnParametersSet方法处理参数变化即可。

关键注意点

  • 避免仅在组件初始化时传递一次参数,必须在打开对话框或节点变化时传递最新值
  • 使用OnParametersSet而非OnInitializedAsync处理参数变化,因为OnInitializedAsync仅在组件创建时执行一次
  • 若使用UpdateParameters,确保对话框组件的参数有公开的setter

内容的提问来源于stack exchange,提问作者Ensar Erdeve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 11:49:54