Blazor 服务器端无法使用 FindView 找到 cshtml 文件

Blazor Server Side unable to find cshtml file using FindView

首先让我说可能有更好的方法来解决这个问题,所以请随时提出不同的方法。

我想做的是从 Blazor 服务器端应用程序中的模板发送电子邮件。据我所知,电子邮件库 (MailKit) 需要将正文呈现为字符串。

当然我希望这是一个模板,所以我的想法是要有一个带有模型的 cshtml 页面。使用传入的模型渲染它并获取输出字符串并将其用于正文。

所以我的邮寄代码应该是这样的:

var email = new MimeKit.MimeMessage();
        email.From.Add(MimeKit.MailboxAddress.Parse(_mailOptions.Value.DefaultFrom));
        email.To.Add(MimeKit.MailboxAddress.Parse(toemail));
        email.Subject = subject;
        email.Body = new MimeKit.TextPart(MimeKit.Text.TextFormat.Html) { Text = cshtmlRenderedText };

        _smtpClient.Send(email);
        _smtpClient.Disconnect(true);

所以我需要能够在不激活控制器的情况下处理 cshtml 和模型,所以我有这个从 here 中找到的例程。

我认为除了找不到我的 cshtml 文件外,一切都会正常进行。这是为什么?

var viewResult = _razorViewEngine.FindView(actionContext, "ConfirmUser.cshtml", false);

我已经尝试对各种路径变体进行硬编码,但似乎没有什么能真正找到我的观点,因为 viewResult.View 始终为空。

也许它找到了我的 cshtml 但由于某种原因它不是“有效的”所以这里是文件:

@model Project.API.Infrastructure.Email.ConfirmUser.ConfirmUserEmailViewModel;

@{
   <p>Welcome @Model.Name,</p>

   <p>Please confirm your email by <a href='@Model.ConfirmUrl'>clicking here</a>.</p>

   <p>If you prefer you can copy and paste this link into your browser of choice.</p>
   <br />
   <p>@Model.ConfirmUrl</p>
   <br />

}

有一个类似的问题 有一个解决方法并不是真正的答案。

如何找到我的 cshtml 文件的路径,或者是否有更好的方法来呈现电子邮件正文的字符串?

你很幸运 - 几个月前我在尝试使用 RazorLight(一个类似的 .cshtml 模板程序)和 运行 时遇到了同样的问题。

我意识到 .razor 文件比 .cshtml 文件更适合这个用例,因为它们编译为纯 C# 类 - 除了没有任何东西可以渲染它们。所以我写了 BlazorTemplater 正是这样做的。

  1. 安装 Blazor Templater Nuget Package
  2. 将您的 .cshtml 文件转换为 .razor(例如 ConfirmUser.razor)并从导入模型切换到使用 .razor 参数,例如
 <p>Welcome @Model.Name,</p>

   <p>Please confirm your email by <a href='@Model.ConfirmUrl'>clicking here</a>.</p>

   <p>If you prefer you can copy and paste this link into your browser of choice.</p>
   <br />
   <p>@Model.ConfirmUrl</p>
   <br />
@code {
  [Parameter] public ConfirmUserEmailViewModel Model {get;set;}
}
  1. 将组件渲染到 HTML:
var viewResult = new ComponentRendered<ConfirmUser>()
      .Set(v => v.Model, myModel)
      .Render();