【发布时间】:2020-06-05 15:57:31
【问题描述】:
我想在我从服务接收的一些 HTML 文本中动态替换 Blazor 客户端组件。
例如,假设我收到以下字符串:
string htmlText = @"
<h1>Heading with {my component} inside it</h1>
";
我想用组件MyComponent 替换大括号内的所有文本,该组件接受参数Text 并呈现为<em>@Text</em>。
最后我想要得到的是:
<h1>Heading with <em>my component</em> inside it</h1>
我得到的最接近的方法是将字符串拆分为 HTML 部分和应替换为组件的部分(如:SplitText = htmlText.Split('{', '}');),然后在 Blazor 页面内的 for 循环中呈现它们:
@for (int i = 0; i < SplitText.Length; i++)
{
if (i % 2 == 0)
{
@((MarkupString)SplitText[i])
}
else
{
<MyComponent Text="@SplitText[i]" />
}
}
然而,这在 Chrome 中呈现为:
<h1>Heading with </h1>
<em>my component</em>
inside it
我也尝试使用RenderFragment,但最终得到了类似的结果。
编辑:
我将添加一些上下文来澄清我正在尝试做的事情。也可能有一些我没有想到的更好的方法,也许解释一下这样做的目的可以帮助有人为我指明一个更好的方向。
这旨在构建一个 Web 应用程序,用户可以在其中使用将输出 HTML(或 Markdown)的富编辑器编写自己的笔记(某种程度)。编辑器还将允许插入一些特殊标签以链接到他们编写的其他笔记。这些是示例中的大括号。文本将存储在数据库中并事先进行验证,因此无需处理语法错误(例如大括号内的 HTML 标记或嵌套的大括号)。当文本将被渲染时,特殊标签应该被相关组件替换,该组件生成链接并处理更多功能(例如,在鼠标悬停时弹出注释的预览)。因此,这将比仅添加 <em> 标记更复杂,如示例中所示。
我认为这可以通过 JavaScript 轻松完成,但首先我想看看是否可以使用纯 Blazor 来完成,因为它是一个非常有趣的新框架。
【问题讨论】:
-
@HenkHolterman 这不仅仅是一个标题,主要是带有格式的段落。不会有像你的例子那样奇怪的东西,因为文本将被验证。我在问题中添加了一些上下文,可能应该从一开始就这样做,抱歉。
-
如果你有解决方案请告诉我
-
有趣的想法,如果你有解决方案请告诉我。
标签: c# dynamic blazor blazor-client-side