Blazor 继承 ChildContent RenderFragments?

2024-03-30

假设我们有一个基本组件ParentComponent.razor:

<div id="ParentComponent">@ChildContent</div>

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

可以这样使用:

<ParentComponent>
    <div>content</div>
</ParentComponent>

这会呈现:

<div id="ParentComponent"><div>content</div></div>

但是假设我们想要一个ChildComponent.razor继承自ParentComponent.razor:

@inherits ParentComponent

<div id="ChildComponent">@ChildContent</div>

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

有没有办法填充父组件的@ChildContent来自 ChildComponent 的 RenderFragment?

<ChildComponent>
    child content
</ChildComponent>

为了产生这个:

<div id="ParentComponent">
    <div id="ChildComponent">child content</div>
</div>

不知道我是否遗漏了一些明显的东西,但已经搞砸了一段时间并且无法在互联网上找到任何答案。

编辑 - 替代解决方案

我找到了另一种方法,它不依赖于直接重写 BuildRenderTree 方法,并允许您使用 html/razor 标记,尽管这确实意味着在房子周围走动。也不确定这是否安全或高性能,但为了完整起见将其放在这里。

ParentElement.razor

@using Microsoft.AspNetCore.Components.Rendering;

@if (!HasRendered()) {
    SetRenderedStatus();
    <div id="ParentComponent">
        RenderChild(__builder);
    </div>
}

@code {
    protected bool _hasBaseRendered = false;

    protected bool HasRendered() {
        return _hasBaseRendered;
    }

    protected void SetRenderedStatus() {
         _hasBaseRendered = true;
    }

    protected virtual void RenderChild(RenderTreeBuilder __builder) { }
}

ChildElement.razor

@using Microsoft.AspNetCore.Components.Rendering
@inherits ParentElement

@if (HasRendered()) {
    <div id="ChildComponent">
         @ChildContent
    </div>
}
@{
    base.BuildRenderTree(__builder);
}

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

    protected override void RenderChild(RenderTreeBuilder __builder) {
        this.BuildRenderTree(__builder);
    }
}

如此快速的解释,IDE/编译器中的功能清楚地将代码的 razor/html 标记部分编译为BuildRenderTree幕后的方法,这就是为什么你不能在一个.razor成分。

上面的代码编译为:

ChildElement.razor

protected override void BuildRenderTree(RenderTreeBuilder __builder)
{
    if (HasRendered())
    {
        __builder.AddContent(0, "    ");
        __builder.OpenElement(1, "div");
        __builder.AddAttribute(2, "id", "ChildComponent");
        __builder.AddMarkupContent(3, "\r\n        ");
        __builder.AddContent(4, ChildContent);
        __builder.AddMarkupContent(5, "\r\n    ");
        __builder.CloseElement();
        __builder.AddMarkupContent(6, "\r\n");          
    }
    base.BuildRenderTree(__builder);
}

所以 ChildContent 被忽略HasRendered为 false,并指示调用base.BuildRenderTree在父类上。

ParentElement.razor

protected override void BuildRenderTree(RenderTreeBuilder __builder)
{
    if (!HasRendered())
    {
        SetRenderedStatus();
        __builder.AddContent(0, "        ");
        __builder.OpenElement(1, "div");
        __builder.AddAttribute(2, "id", "ParentComponent");
        __builder.AddMarkupContent(3, "\r\n");
        RenderChild(__builder);
        __builder.AddContent(4, "        ");
        __builder.CloseElement();
        __builder.AddMarkupContent(5, "\r\n");
    }
}

它呈现父母标记,中途被定向到RenderChild它在子进程上被覆盖,这将流程返回到子进程的一个级别,其中它BuildRenderTree然后被称为HasRenderedcheck 将确保避免无限循环,然后在返回到父级完成之前渲染标记的子级部分。

这可能会被重构,只是我当前的工作副本实验。


复制并测试...

父组件.cs

public partial class ParentComponent : ComponentBase
{
    [Parameter] public RenderFragment ChildContent { get; set; }

    protected override void BuildRenderTree(RenderTreeBuilder builder)
    {
        builder.OpenElement(0, "div");
        builder.AddAttribute(1, "id", "ParentComponent");
        builder.AddContent(2, ChildContent);
        builder.CloseElement();
        
        base.BuildRenderTree(builder);
    }
}

子组件.cs

public partial class ChildComponent : ParentComponent
{
    protected override void BuildRenderTree(RenderTreeBuilder builder)
    {
        builder.OpenComponent<ParentComponent>(0);
        builder.AddAttribute(1, "ChildContent", (RenderFragment)((builder2) => 
       {
            builder2.OpenElement(1, "div");
            builder2.AddAttribute(2, "id", "ChildComponent");
            builder2.AddContent(3, ChildContent);
            builder2.CloseElement();
        } ));

        builder.CloseComponent();
    
    }
}

索引剃刀

@page "/"

<ChildComponent>child content</ChildComponent>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Blazor 继承 ChildContent RenderFragments? 的相关文章

  • 如何从 MVC/Razor 页面将参数传递到顶级服务器端 blazor 组件?

    将 Blazor 组件添加到现有 MVC 或 Razor 页面时 能够将参数传递到 Blazor 组件中非常有用 例如将 MVC 页面的 URL 中的参数 例如 ID 传递到组件上 直到 Core 3 Preview 9 服务器渲染组件才可
  • 如何在 Blazor 中使用 TagHelpers?

    我创建了一个标签助手 并想在我的 Blazor 示例项目中使用它 但是 当我想使用标签助手时 编译器会抱怨 CS0103 The name StartTagHelperWritingScope does not exist in the c
  • Blazor Timer 调用异步 API 任务来更新 UI

    我正在 Blazor 服务器端页面中设置计时器 目标是每 x 秒调用一次 API 并根据返回值更新 UI 我得到这个代码 private string Time get set protected override void OnIniti
  • 如何访问 Blazor 服务器客户端的当前线路

    我正在开发一个使用 ASP NET Core 的 Blazor Server 项目Identity 我正在尝试实现一个组件来管理当前的活动用户 我可以访问当前客户端的当前身份用户 但我似乎无法访问与当前客户端关联的电路 因为我想跟踪每个用户
  • 如何在自定义验证属性中获取/注入服务

    我们使用 NET Core 3 1 5 这是一个 Blazor 服务器应用程序 我们有一个 ValidationAttribute 并需要访问外部服务来验证对象 ValidationAttribute 有 IsValid 方法 protec
  • 如何在 Blazor 客户端应用程序中使用 Bootstrap 模式?

    我正在尝试显示引导模式然后绑定其按钮 但我无法通过显示模式的第一步 我正在使用 net core 3 1 的 Blazor 客户端模板 我有一个名为 Modal razor 的页面 其中包含我从 getbootstrap com 找到的引导
  • 如何判断代码是否将在 Blazor 的客户端或服务器上运行?

    我是 Blazor 开发的新手 我可能在这里遗漏了一些明显的东西 但是搜索 google 阅读文档和搜索此网站并没有为我找到答案 出于安全原因 我需要确保一些代码在服务器端运行 例如散列密码 我知道 Blazor 通常会自动确定代码的运行位
  • C# 修改身份或添加声明

    应用程序是 Blazor Server NET Core 5 0 我正在使用 NET Core 的身份系统 但遇到了问题 我希望将这个人的名字与身份一起存储 以便我可以轻松地调用它 目前我有一个类覆盖基本身份 public class Ap
  • Blazor 继承 ChildContent RenderFragments?

    假设我们有一个基本组件ParentComponent razor div ChildContent div code Parameter public RenderFragment ChildContent get set 可以这样使用
  • 在服务器端 Blazor 项目中构建身份时出错

    我正在开发一个服务器端 Blazor 应用程序 该应用程序是使用为身份验证选择的 个人用户帐户 选项创建的 我现在想要自定义登录页面 但是当我选择通过脚手架添加身份页面时 我收到以下错误 并且我不确定从哪里开始进行故障排除 无法在内存中编译
  • 为什么 Blazor 生命周期方法会执行两次?

    因此 随着 asp net core 3 0 和 blazor 1 0 的发布 我开始使用 blazor 进行一些实际工作 将 Blazor 组件代码拆分为后台代码时 我使用以下内容 public class LogoutModel Bla
  • Razor Pages 与服务器端 Blazor

    用于服务器端 Web 应用程序 就像过去的美好时光一样 Blazor https learn microsoft com en us aspnet core blazor view aspnetcore 3 1旨在提供流行 JavaScri
  • Sqlite 与 Blazor Wasm (.NET 6) -> System.DllNotFoundException: e_sqlite3

    根据 NET 6 中的新 Blazor WebAssembly 功能 NET 6 中的新 Blazor WebAssembly 功能 Sqlite 与 Blazor Wasm NET 6 gt System DllNotFoundExcep
  • BlazorWebView 内的 .NET MAUI Xaml

    我正在完全使用 Blazor 构建我的应用程序 一切都发生在我的 BlazorWebView 内 是否可以使用类似的东西RefreshView在 razor 文件中 我知道我可以实例化一个ContentView从代码后面但是我可以将其实现到
  • 为 Blazor UI 应用程序实施防伪验证

    我们的应用程序是使用 Blazor Server 和与 Azure API 通信的 razor 页面构建的 我想知道对于 Blazor UI 我们是否应该实现防伪造 CSRF XSRF 如果可以 我可以获得一些如何实现的信息吗 我观察到为
  • “TransformAppSettings”任务意外失败

    我有一个 NET Core 3 Blazor 服务器端 应用程序 我最近从预览版 5 版本升级到了 NET Core 3 0 1 预览版 6 版本 当我在本地构建并运行它时 它工作正常 但是当尝试将其发布到文件系统文件夹 在框架相关模式下
  • 如何通过 HttpContext 访问 Blazor Server .Net 6 中的 cookie?

    不幸的是 有关在 Blazor Server 中访问 c ookie 的教程和之前的 StackOverflow 答案似乎在新的 Net 版本中变得无效 例如 我无法获得以下任一答案 根据 net 6 中没有的评论来判断 如何在服务器端 B
  • 可以在 Blazor 布局中使用 ViewComponent 吗?

    刚刚第一次尝试 Blazor 使用默认的 Blazor 模板 我添加了一个ViewComponent致电MainLayout cshtml await Component InvokeAsync HeaderComponent Intell
  • 如何使用 Blazor 在 ASP.NET CORE 中更新数据库后刷新网页

    我正在制作一个小型房间预订网络应用程序 我希望在给定的时间间隔内刷新网页 即给定的一分钟或对数据库进行更改时 我发现StateHasChanged 但我真的不知道如何实现它 这里是新手一克诺比 我尝试将其放在将约会添加到日程表的函数中 va
  • 将客户端库添加到 Razor 类库

    我正在学习 Blazor 我注意到创建 Razor 类库是一个很好的做法 您将在其中定义大部分组件 这样您就可以在客户端或服务器中使用它们 而不会出现太多问题 在不同的框架中 我习惯于以 SASS 形式包含库作为引导程序 这样我就可以在我的

随机推荐

  • rand() 在 C 语言中有多独特?

    我在用rand 对于需要唯一值的 6 位字段 我做对了吗 几率有多大 rand 可以在连续或频繁的通话中给我类似的值吗 当我使用 rand 时 它是独一无二的 但是 当我打电话时返回相同的号码srand time NULL or srand
  • Powershell脚本:无法读取执行程序的返回值

    我正在使用 PowerShell 运行一个执行的脚本wget获取网页 一个简单的数据库导入脚本 并分析其输出 错误消息或 确定 我正在使用答案中的代码上一个问题 https stackoverflow com questions 20345
  • 最新的浏览器中有内置的 javascript 字符串哈希函数吗?

    每当新版本的浏览器出现时 我都会听到添加新的东西 比如 webGL 和其他没有人真正知道它们是否能赶上的技术 但我想知道是否有人考虑过 JS 中的哈希函数 MD5 SHA1 等 等基本内容 我所说的最新浏览器也指当今的开发版本 例如 Ope
  • 如何使用 EF 6.0 中的代码优先方法从 sql 表中删除列?

    我错误地在数据库中添加了一列 名为doj现在 如果我想使用代码优先方法从表中删除该列 我应该做什么 我已经尝试过这些事情 1 从模型中删除列定义 2 删除了迁移历史记录 3 添加迁移4 更新数据库 但它仍然没有反映在数据库中 我哪里犯了错误
  • 在 Spark 中,广播是如何工作的?

    这是一个非常简单的问题 在 Spark 中 broadcast可用于有效地将变量发送给执行器 这是如何运作的 更确切地说 何时发送值 我一打电话就发送broadcast 或者何时使用这些值 数据到底发送到哪里 发送给所有执行者 还是只发送给
  • 将数字列表转换为范围

    我有一堆数字 请说以下内容 1 2 3 4 6 7 8 20 24 28 32 那里提供的信息可以用 Python 表示为范围 range 1 5 range 6 9 range 20 33 4 在我的输出中我会写1 4 6 8 20 32
  • Swing 应用程序 -> 拖放到桌面/文件夹

    当 Mac 的 Finder Windows 的 Explorer 将 Swing 应用程序中的特定项目拖放到桌面和文件夹时 如何获取我放弃的前路径 我很高兴教给我必要的课程和方法 这是一个小程序 但它适用于任何框架或窗口 public c
  • 根据内容拆分 .txt 文件

    我有一个巨大的 txt文件如下 small file content 1 br small file content 2 br small file content n br 我如何将其分割成n个文件 最好通过bash Use csplit
  • 将 models.py 拆分为多个文件

    我正在尝试拆分models py我的应用程序分成几个文件 我的第一个猜测是这样做 myproject settings py manage py urls py init py app1 views py init py models in
  • 如何声明两个列表具有相同的长度?

    我需要知道如何比较 Prolog 中两个列表的长度 这是我到目前为止所拥有的 sum N1 N2 checklength N1 N2 checklength N1 N2 L1 is length N1 What L2 is length N
  • 如何使用 selenium ide 专注于新窗口?

    我正在尝试使用 selenium ide 来复制操作 该操作是单击打开新窗口的链接 如何让 selenium ide 聚焦在新窗口而不是另一个窗口上 它对我不起作用 选择窗口 为此 您需要使用selectWindow windowName命
  • 创建 JSON 并编辑复杂查询 (oracle 11g)

    我有 4 个不同的表 table price product 包含与产品相关的信息和 他们的价格 table price list 包含与价目表相关的信息 prices per client 包含与价格相关的信息 不同的客户给出特定的产品
  • 角度范围绑定 &(&) 是一次性绑定吗?

    角度范围绑定 是一次性绑定吗 我看到它被称为单向绑定 但它也是一次性的吗 假设我有
  • 在 Java 中嵌入树状图

    我正在寻找一个能够绘图的图书馆树状图 http en wikipedia org wiki DendrogramJava中的数据 不计算它们 我可以自己做 你有任何线索吗 已经尝试通过谷歌搜索它 但没有找到任何不独立的东西 虽然我需要将生成
  • 使用 Java Graphics2D API 在 TextLayout 中将文本右对齐

    因此 我正在使用 Java 教程中的代码来绘制一段文本 但我不知道如何将文本与右边距对齐 我刚刚包括attstring addAttribute TextAttribute RUN DIRECTION TextAttribute RUN D
  • 如何使用 Hibernate 测试表是否为空

    使用 Hibernate 确定表是否为空或非空的最有效方法是什么 换句话说 该表是否有 0 行或多于 0 行 我可以执行 HQL 查询select count from tablename然后检查结果是否为 0 或非 0 但这不是最佳选择
  • Mysql errno 150 尝试使用外键引用创建表

    我正在尝试在 mysql 中创建一个带有外键引用的表 如下所示 在数据库A中 CREATE TABLE replication id varchar 255 NOT NULL PRIMARY KEY uid varchar 255 NOT
  • RESTful servlet URL - web.xml 中的 servlet 映射

    我觉得这是一个常见问题 但我研究过的都还没有起作用 在我的 web xml 中 我有所有 REST 调用的映射
  • pip3 安装 pyautogui 失败,错误代码 1 Mac OS

    我尝试安装 autogui python 扩展 pip3 install pyautogui 此安装尝试会导致以下错误消息 Collecting pyautogui Using cached PyAutoGUI 0 9 33 zip Com
  • Blazor 继承 ChildContent RenderFragments?

    假设我们有一个基本组件ParentComponent razor div ChildContent div code Parameter public RenderFragment ChildContent get set 可以这样使用