【问题标题】:How do I write Blazor HTML code inside the @code block?如何在 @code 块内编写 Blazor HTML 代码?
【发布时间】:2020-01-10 08:54:40
【问题描述】:

如何在 @code 块内的函数中编写 Blazor HTML 代码?

考虑以下代码:

@page "/Test"

@if (option == 1)
{
    drawSomething("Something");
}
else
{
    drawSomething("Something else");
}

@code {
    int option;

    void drawSomething(string message)
    {
        <p>message</p>
    }
}

在我尝试构建之前它不会产生任何错误,然后它会给我以下错误:

错误 CS0103 名称 '__builder' 在当前不存在 上下文

在 (Test.razor.g.cs) 中的行:

__builder.AddContent(0, "        ");
__builder.AddMarkupContent(1, "<p>message</p>\r\n");

如果这意味着 Blazor HTML 代码只能写在文件的第一部分而不是函数或类中,这似乎非常有限。

我正在使用最新版本的 blazor 编写版本 (3.0.100-preview9-014004)。

注意:给定示例中的输出是高度简化的,我想知道我是否以及如何能够从函数中编写代码,而不是以更好的方式解决上面的输出。

【问题讨论】:

    标签: c# blazor blazor-server-side


    【解决方案1】:

    更新,您现在可以使用:

    @GreetPerson("John")
    
    @code {
      RenderFragment GreetPerson(string name)
      {
        return @<p>Hello <em>@name</em></p>;
      }
    }
    

    旧答案:

    这是announced as a feature for Preview6,但当时并没有像宣传的那样工作,而且一些细节后来似乎发生了变化。该页面底部有一条来自 Cosmin Sontu 的评论指出了正确的方向:

    @using Microsoft.AspNetCore.Components.Rendering
    
    @*tested with preview 9*@
    @{ GreetPerson(__builder, "John"); }
    
    @code {
    
        void GreetPerson(RenderTreeBuilder __builder, string name)
        {            
            <p>Hello, <em>@name!</em></p>
        }
    }
    

    名称__builder 无法更改。这是一个双下划线。

    【讨论】:

    • 好极了,它看起来有点像 hack,但完全符合我的需要,所以我非常感谢它可能,非常感谢你的帮助!
    • 这在 Razor 组件中并不是一个可行的解决方案,这比 hack 更糟糕,即使目前有效。下一个预览,它不会。我会写一个答案...
    • @Issac 你不认为如果删除它,支持类似功能的语法会有一个简单的变化,因为它在 Preview6 的博客文章中被提及为一个特性,并且看起来相当对我来说基本功能。
    • 这是制作可重用模板的好方法!渲染方法可以设为静态并放置在任何随机 .razor 文件中并在任何地方引用。 @enet,它仍然可以在生产中使用,我不同意这是一个 hack。它只是利用 Blazor 从 .Razor 文件生成 .cs 的已知方式。
    • 这也被记录为执行此操作的有效方法:github.com/dotnet/AspNetCore.Docs/blob/…
    【解决方案2】:

    版本 1

    在 Blazor 中,惯用的方式是创建组件,而不是尝试直接在 @code 中编写 HTML。

    创建drawSomething.razor

    <p>@Message</p>
    
    @code {
        [Parameter]
        public string Message {get;set;}
    }
    
    

    在你的Test.razor

    @page "/Test"
    
    @if (option == 1)
    {
        <drawSomething Message="Something" />
    }
    else
    {
        <drawSomething Message="Something else" />
    }
    
    @code {
        int option;
    }
    
    

    这里我假设你有更复杂的东西,然后就简单了

    .

    第 2 版

    如果你真的想要简单的方法,那么就

    @page "/Test"
    
    @if (option == 1)
    {
        <p>Something</p>
    }
    else
    {
        <p>Something else</p>
    }
    
    @code {
        int option;
    }
    
    

    第 3 版 基于 Isaac 的建议

    @page "/Test"
    
    @if (option == 1)
    {
        <drawSomething Message="Something" />
    }
    else
    {
        <drawSomething Message="Something else" />
    }
    
    @code {
        int option;
    
        RenderFragment drawSomething(string message)
        {
            return @<p>@message</p>;
        }
    }
    
    

    【讨论】:

    • 感谢您的广泛回答,但是我确实了解组件,该示例可能有点过于简化,因为您的解决方案当然要好得多,但是对于这个问题,我实际上很感兴趣在函数中编写 HTML,而不仅仅是在可能的情况下输出消息。
    • 您的版本 3 错误或过时。用法必须是:@drawSomething("Something")
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 2018-08-04
    • 2020-01-11
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多