Blazor非基类继承

5

考虑一个简单的 Blazor 组件 MyText

<p>@Title</p>

public partial class MyText
{
    [Parameter] public string Title { get; set; }
}


在页面中,我使用它的形式为:<MyText Title="Abc" /> 现在我想扩展这个组件,但不想改变它,而是通过一个新组件 MyTextEx 来派生它并添加另一个参数。类似于:
@inherits MyText

<!-- Show base component something like: --!>
@base

<p>@Message</p>

public partial class MyTextEx
{
    [Parameter] public string Message { get; set; }
}

我找不到如何显示基础组件的内容?因此它被渲染为:

<p>@Title</p>
<p>@Message</p>

请注意,这只是一个简单的例子,我的基本组件有很多参数、事件,并且希望有虚方法可以被扩展/派生组件覆盖。我试图避免在razor文件中使用组合方式来处理基本组件,因为据我所知,我必须再次填充它的参数。
@inherits MyText

<MyText Title="@Title" />

<p>@Message</p>

我能够找到基本/抽象组件的继承示例,但是找不到包含final 组件的继承示例。

有任何想法如何实现这一点吗?

谢谢,Csaba

2个回答

12
@inherits MyText

<!-- Show base component like: --!>
@RenderBase()

<p>@Message</p>

@code 
{    
    // Message etc ...

    RenderFragment RenderBase() => builder => base.BuildRenderTree(builder);    
}

就此而言,我刚在VS 2019上尝试了一下,在一个Blazor wasm应用程序中使用.Net Core 3.1,但它无法编译,抱怨RenderBase在当前上下文中不存在。然而,@sw1337(下面)提供的解决方案可以。 - Stuart Hemming
Renderbase是在@code内声明的方法。因此,您一定输错了什么。 - H H
Henk,那是因为我比一件非常非常愚蠢的东西还要笨!对不起打扰了。 :-) - Stuart Hemming
我们可以从基类管理 @RenderBase 方法吗? - tobias

3
更加直接的替代方案如下:
@inherits MyText

<!-- Show base component something like: --!>
@{ base.BuildRenderTree(__builder); }

<p>@Message</p>

public partial class MyTextEx
{
    [Parameter] public string Message { get; set; }
}

虽然我已经成功渲染了基类,但我无法实现您建议的“partial class”部分。按照现有的定义,该类的定义只会呈现为文本。 - Stuart Hemming
2
这种“hack”在大多数简单的用例中都有效,但在某些场景中会默默地失败(令人发狂),其中对base.BuildRenderTree(__builder)的调用被包装在其他组件标记中。我怀疑其他组件可能会以某种方式破坏__builder引用。我无法告诉你为什么,但接受的答案在这个问题上起作用,而这个答案则没有。 - Ola Berntsson
1
@OlaBerntsson 你的评论刚刚救了我免于疯狂!谢谢!我想说这个不起作用是因为当它被包裹在其他组件标签中时,意味着它是由父组件以 RenderFragment 的形式渲染的(而父组件在 __builder 构建器已经完成后才会被渲染)。 - Conman_123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接