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

Net MAUI Blazor RenderFragment渲染DOM异常问题求助

解决.NET MAUI Blazor RenderFragment 渲染DOM的问题

问题分析

你的代码核心问题是在RenderFragment的委托方法里错误混用了Razor模板语法(比如@if、直接写<div>标签)和字符串拼接。Blazor的RenderFragment需要通过__builder对象的API(如OpenElement、CloseElement等)构建DOM,直接在委托内写Razor语法会被编译器当成纯文本处理;同时字符串拼接生成的MarkupString会丢失Blazor的组件事件绑定能力。

正确实现方式

不需要用字符串拼接,直接通过RenderFragment的构建逻辑,先将_UserPrograms按每2个元素分组,再遍历每组渲染对应的row和col-6元素,既能保留事件绑定,又能生成预期的DOM结构:

方式一:使用__builder API构建

private RenderFragment userProgram => (__builder) =>
{
    // 将数据按每2个一组拆分
    var groupedPrograms = _UserPrograms.Chunk(2);
    
    foreach (var group in groupedPrograms)
    {
        // 打开row标签
        __builder.OpenElement(0, "div");
        __builder.AddAttribute(1, "class", "row mt-3");
        __builder.AddContent(2, () =>
        {
            foreach (var value in group)
            {
                // 打开col-6标签
                __builder.OpenElement(3, "div");
                __builder.AddAttribute(4, "class", "col-6");
                __builder.AddAttribute(5, "onclick", EventCallback.Factory.Create(this, () => runUserProgram("test")));
                // 添加内容,可替换为实际需要展示的value属性
                __builder.AddContent(6, "Test");
                // 关闭col-6标签
                __builder.CloseElement();
            }
        });
        // 关闭row标签
        __builder.CloseElement();
    }
};

方式二:简洁的Razor模板写法

如果是在组件内定义RenderFragment,可以直接用Razor模板语法,更易读:

@code {
    private RenderFragment userProgram => @<text>
        @foreach (var group in _UserPrograms.Chunk(2))
        {
            <div class="row mt-3">
                @foreach (var value in group)
                {
                    <div @onclick="() => runUserProgram("test")" class="col-6">Test</div>
                }
            </div>
        }
    </text>;
}

原代码失效原因

  1. RenderFragment委托语法错误:RenderFragment的(__builder) => { ... }是C#委托,内部不能直接写@if、<div>这类Razor语法,编译器无法识别,会将这些内容当作纯文本输出。
  2. MarkupString丢失事件绑定:用字符串拼接生成的HTML通过MarkupString渲染时,Blazor不会处理其中的事件绑定(如@onclick),因为这类字符串不会经过Blazor的组件渲染管道,仅作为纯HTML文本输出。

内容的提问来源于stack exchange,提问作者Александр Мун

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:50:21