【问题标题】:Blazor non-base class inheritanceBlazor 非基类继承
【发布时间】:2020-09-10 03:07:21
【问题描述】:

考虑一个简单的 blazor 组件 MyText

<p>@Title</p>

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

在页面中,我将其用作: &lt;MyText Title="Abc" /&gt;

现在我想扩展这个组件,但不想更改它,而是通过一个新组件 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 文件中使用类似组合的方法,因为 AFAIK 我必须再次使用参数填充它:

@inherits MyText

<MyText Title="@Title" />

<p>@Message</p>

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

知道如何实现吗?

谢谢,Csaba

【问题讨论】:

    标签: c# inheritance razor blazor


    【解决方案1】:
    @inherits MyText
    
    <!-- Show base component like: --!>
    @RenderBase()
    
    <p>@Message</p>
    
    @code 
    {    
        // Message etc ...
    
        RenderFragment RenderBase() => builder => base.BuildRenderTree(builder);    
    }
    

    【讨论】:

    • FWIW,我刚刚在 Blazor wasm 应用程序上使用 .Net Core 3.1 在 VS 2019 中尝试过这个,它不会编译抱怨 RenderBase 在当前上下文中不存在,但是,解决方案@sw1337(下)提供的确实
    • Renderbase 是在@code 中声明的方法。所以你一定打错了什么。
    • Henk,那是因为我比一个非常非常愚蠢的东西更愚蠢! :-( 很抱歉打扰了。:-)
    【解决方案2】:

    接受答案的更直接替代方案:

    @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 部分。正如所写,类的定义只是呈现为文本。
    • 这种“hack”适用于大多数简单的用例,但在对 base.BuildRenderTree(__builder) 的调用包含在其他组件标签中的某些情况下会默默地(并且令人发狂地)失败。我怀疑其他组件可能会以某种方式破坏 __builder 引用。我无法告诉你为什么,但接受的答案在这个没有的地方有效。
    猜你喜欢
    • 2020-05-16
    • 1970-01-01
    • 2019-05-14
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多