是否可以从 Razor/Blazor 组件中获取原始 HTML?

Is it possible to get raw HTML from Razor/Blazor components?

我想使用 MailKit 设置 "mailer/newsletter"。我的站点堆栈基于 Blazor Web 程序集并使用 .Razor 组件。

我想知道是否有一种方法可以使用我编写的 razor 组件,将 HTML 输出到我用来生成电子邮件正文的 MimeMessage 对象中,以及该架构的外观/ 实现此目标的最佳方法?

类似问题(虽然不是 Blazor):

我在这里使用 Blazor 和 MailKit:Google Email Viewer in Server Side Blazor

我用MarkupString来显示邮件内容是这样的:

@using MimeKit
@using MessageReader
@strError
<div style="padding:2px; vertical-align:top">
    <div><i>@MimeKitMessage.Date.ToString()</i></div>
    <div><b>From:</b> @MimeKitMessage.From.ToString()</div>
    <div><b>To:</b> @MimeKitMessage.To.ToString()</div>
    <div><b>Subject:</b> @MimeKitMessage.Subject</div>
    <br />
    <div>@((MarkupString)@htmlEmail)</div>
</div>
@code {
    [Parameter] public Message paramMessage { get; set; }
    MimeMessage MimeKitMessage;
    string strError = "";
    string htmlEmail = "";
    protected override void OnInitialized()
    {
        try
        {
            if (paramMessage != null)
            {
                string converted = paramMessage.Raw.Replace('-', '+');
                converted = converted.Replace('_', '/');
                byte[] decodedByte = Convert.FromBase64String(converted);
                using (Stream stream = new MemoryStream(decodedByte))
                {
                    // Convert to MimeKit from GMail
                    // Load a MimeMessage from a stream
                    MimeKitMessage = MimeMessage.Load(stream);
                    // Convert any embedded images
                    var visitor = new HtmlPreviewVisitor();
                    MimeKitMessage.Accept(visitor);
                    htmlEmail = visitor.HtmlBody;
                    //If the email has attachments we can get them here
                    //var attachments = visitor.Attachments;
                }
            }
        }
        catch (Exception ex)
        {
            strError = ex.Message;
        }
    }    
}

因为我刚看到这个问题所以回答晚了:我写了一个名为 BlazorTemplater 的替代系统,它使用 .razor 文件而不是 .cshtml 因为我遇到了这个问题。

您可以将模板转换为 .razor 格式,然后使用 BlazorTemplater 呈现为 HTML:

var html = new ComponentRenderer<MyRazorClass>()
   .Set(c => c.SomeParameter = someValue)
   .Render();

它支持参数、DI 注入和嵌套组件,所以您应该会发现它很有用!在 Razor Class 库中设置和工作也更容易。