我想创建一个派生组件,其中基本组件渲染到另一个Razor组件中.像这样的东西

@inherits BaseComponent

<AdditionalComponent>
    @{
        base.BuildRenderTree(__builder);
    }
</AdditionalComponent>

但是,派生组件永远不会呈现其BaseComponent.它只显示AdditionalComponent

这里有一个例子说明了这个问题.

BaseComponent.razor

<h3>BaseComponent</h3>

AdornmentComponent.razor

<div>
    <h3>Top of Adornment</h3>
    @ChildContent
    <h3>Bottom of Adornment</h3>
</div>

@code {
    [Parameter] public RenderFragment ChildContent { get; set; }
}

DerivedComponent.razor

@inherits BaseComponent

<AdornmentComponent>
    @{
        base.BuildRenderTree(__builder);
    }
</AdornmentComponent>

Test.razor

@page "/Test"

<DerivedComponent />

我希望它呈现为

<h3>Top of Adornment</h3>
<h3>BaseComponent</h3>
<h3>Bottom of Adornment</h3>

但相反,它呈现的是

<h3>Top of Adornment</h3>
<h3>Bottom of Adornment</h3>

推荐答案

编译器将剃须刀代码转换为cSharp代码,然后编译为MSIL.您可以通过在csproj中添加以下内容来查看此中间编译结果:

<PropertyGroup>
  <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
  <CompilerGeneratedFilesOutputPath>.</CompilerGeneratedFilesOutputPath>
</PropertyGroup>

<ItemGroup>
  <Compile Remove="Microsoft.NET.Sdk.Razor.SourceGenerators\**" />
</ItemGroup>

如果您想通过解决方案资源管理器显示这些文件,请单击"显示所有文件".


DerivedComponent.razor生成的CSharp为:

protected override void BuildRenderTree(RenderTreeBuilder __builder)
{
    __builder.OpenComponent<AdornmentComponent>(0);
    __builder.AddAttribute(1, "ChildContent", __builder2 => {
        base.BuildRenderTree(__builder);
    });
    __builder.CloseComponent();
}

我们可以看到,错误的RenderTreeBuilder被传递给了AdornmentComponent.

DerivedComponent.razor需要修复才能使用__builder2呈现AdornmentComponent‘S子内容:

@inherits BaseComponent

<AdornmentComponent>
@{
    base.BuildRenderTree(__builder2);
}
</AdornmentComponent>

它看起来很管用,但也看起来很老套……我更愿意推荐使用@RBee建议的解决方案.

或者我最喜欢的,是这样的构图:

@inherits BaseComponent

<AdornmentComponent>
    <BaseComponent />
</AdornmentComponent>

Csharp相关问答推荐

ASP.NET Core将SON重新序列化为派生类

PredicateBuilder不是循环工作,而是手动工作

AutoMapper -如何为两个不同的用例设置单个映射?

ASP.NET MVC购物车数量更新并从购物车中删除项目

C#相同名称的枚举方法和normal方法,参数类型不同

使用命令初始化可绑定属性

XUNIT是否使用测试数据的源生成器?

MS Graph v5.42.0:在寻呼消息时更改页面大小

为什么在使用动态obj+类obj时会调用串联?

如何使用NumberFormatInfo

如何在NET 8最小API中自动记录TypedResults.Stream响应

如何在CSharp中将json字符串转换为DataTable?

当我将`ConcurentDictionary`转换为`IDictionary`时,出现了奇怪的并发行为

我可以强制System.Text.Json.JsonSerializer以非递归方式工作吗?

数据库操作预计影响1行,但实际影响0行; after _dbContext.SaveChanges();

删除MudRadio时,MudRadioGroup未 Select 正确的MudRadio

如何在.NET Core 8中自定义标识用户模型

C#中COM对象的实际地址

SignalR跨域

读取测试项目中的应用程序设置