【问题标题】:Generate C# from razor (blazor)从 razor (blazor) 生成 C#
【发布时间】:2023-01-30 18:39:43
【问题描述】:

我正在尝试使用包从代码生成 g.cs

    <PackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.5" />

将razor编译成cs的示例代码:

        var engine = RazorProjectEngine.Create(RazorConfiguration.Default, RazorProjectFileSystem.Create(pathWhereCsProjLives));
        var file = engine.FileSystem.GetItem("/pages/Counter2.razor");
        var document = engine.Process(file).GetCSharpDocument();
        var generatedCode = document.GeneratedCode;

它不能正常工作。例如,将生成一个按钮,如下所示:

__builder.AddMarkupContent(5, "<button class=\"btn btn-primary\" @onclick=\"IncrementCount\">Click me</button>");

应该是这样的:

        __builder.OpenElement(5, "button");
        __builder.AddAttribute(6, "class", "btn btn-primary");
        __builder.AddAttribute(7, "onclick", Microsoft.AspNetCore.Components.EventCallback.Factory.Create<Microsoft.AspNetCore.Components.Web.MouseEventArgs>(this, IncrementCount
        ));
        __builder.AddContent(8, "Click me");
        __builder.CloseElement();
    }

【问题讨论】:

  • 尽管名称相似,但 Blazor 和 Razor 是截然不同的技术。此处使用的 Razor(以及 Microsoft.AspNetCore.Razor.Language 使用的)是关于服务器端生成 HTML 内容然后发送到客户端的。 Blazor 通常是关于在客户端生成 HTML(在 Web 程序集变体中表现得最清楚和明显)。 Blazor 功能主要可以在 Microsoft.AspNetCore.Components 命名空间中找到。考虑到所有这些,您应该解释您实际想要完成的事情,因为您当前的方法行不通。
  • 在设计器上工作,用户可以使用实时预览编写 blazor 组件(热重载目前有很多限制)。基本上我想创建 Microsoft.NET.Sdk.Razor.SourceGenerators 所做的 g.cs。 file.razor -> file.g.cs。或者如果有一种方法可以在运行时采用剃刀组件并创建类型,那就更好了。
  • 你能做到吗?我正在努力完成同样的事情
  • 不!当前的解决方案是为整个项目调用 dotnet build,我讨厌它。

标签: razor blazor code-generation


【解决方案1】:

我尝试了另一种语法

<button class="btn btn-primary" onclick=@OnClickFunc> ClickMe </button>

它产生了

        __builder.CloseElement();
        __builder.AddMarkupContent(5, "
");
        __builder.OpenElement(6, "button");
        __builder.AddAttribute(7, "class", "btn btn-primary");
        __builder.AddAttribute(8, "onclick", OnClickFunc);
        __builder.AddContent(9, " ClickMe ");
        __builder.CloseElement();
    }

    private void OnClickFunc() {
        Console.WriteLine("OnClick");
    }

它在这里运作良好。

使用 &lt;PackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.13" /&gt;

【讨论】:

    猜你喜欢
    • 2015-02-16
    • 2018-07-17
    • 2020-05-23
    • 1970-01-01
    • 2019-09-24
    • 2019-07-31
    • 2021-04-10
    • 2012-05-23
    • 1970-01-01
    相关资源
    最近更新 更多