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

如何在Blazor Server中实现递归嵌套LogModel的折叠展开显示

解决方案

核心思路:使用递归 Razor 组件替代 MarkupString

Blazor 原生支持组件递归调用,完全可以规避 MarkupString 无法绑定事件的问题,所有交互逻辑都走原生 Blazor 事件绑定即可实现需求。


步骤1:确认LogModel定义

public class LogModel
{
    public string Description { get; set; }
    public bool Collapsed { get; set; } = true; // 默认折叠
    public List<LogModel> Children { get; set; } = new();
}

步骤2:创建递归渲染组件LogNode.razor

这是实现嵌套渲染的核心,单个组件对应单条LogModel节点,内部调用自身渲染子节点:

<div class="ms-3 my-1">
    <div class="d-flex align-items-center gap-2">
        @* +/-折叠切换按钮 *@
        <button class="btn btn-sm btn-outline-secondary" @onclick="ToggleCollapse" style="width:24px;height:24px;padding:0;">
            @(CurrentLog.Collapsed ? "+" : "-")
        </button>
        <span>@CurrentLog.Description</span>
    </div>

    @* 子节点区域,用Bootstrap collapse类控制显隐 *@
    @if (CurrentLog.Children.Any())
    {
        <div class="@(CurrentLog.Collapsed ? "collapse" : "show") ms-4">
            @foreach (var childNode in CurrentLog.Children)
            {
                <LogNode CurrentLog="childNode" />
            }
        </div>
    }
</div>

@code {
    [Parameter, Required]
    public LogModel CurrentLog { get; set; }

    private void ToggleCollapse()
    {
        CurrentLog.Collapsed = !CurrentLog.Collapsed;
    }
}

步骤3:父页面调用组件

只需要传入根层级的LogModel列表即可完成全量渲染:

@page "/loglist"

<h3>嵌套日志列表</h3>
<div class="container mt-3">
    @foreach (var rootLog in RootLogList)
    {
        <LogNode CurrentLog="rootLog" />
    }
</div>

@code {
    // 根日志列表,替换为你的实际业务数据
    private List<LogModel> RootLogList = new();

    protected override void OnInitialized()
    {
        // 模拟构造嵌套测试数据
        RootLogList.Add(new LogModel
        {
            Description = "一级日志1",
            Children = new List<LogModel>
            {
                new LogModel { Description = "二级日志1-1" },
                new LogModel { 
                    Description = "二级日志1-2",
                    Children = new List<LogModel>
                    {
                        new LogModel { Description = "三级日志1-2-1" }
                    }
                }
            }
        });
        RootLogList.Add(new LogModel { Description = "一级日志2" });
    }
}

注意事项

  • 组件嵌套层级无特殊限制,只要数据结构支持即可正常渲染
  • 所有节点的折叠状态直接绑定到LogModel实例本身,节点间状态不会互相干扰
  • 全程不需要手动操作DOM,所有显隐逻辑由Blazor数据驱动自动更新

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:06:00