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 正是这样做的。
- 安装 Blazor Templater Nuget Package
- 将您的
.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;}
}
- 将组件渲染到 HTML:
var viewResult = new ComponentRendered<ConfirmUser>()
.Set(v => v.Model, myModel)
.Render();
首先让我说可能有更好的方法来解决这个问题,所以请随时提出不同的方法。
我想做的是从 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 正是这样做的。
- 安装 Blazor Templater Nuget Package
- 将您的
.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;}
}
- 将组件渲染到 HTML:
var viewResult = new ComponentRendered<ConfirmUser>()
.Set(v => v.Model, myModel)
.Render();