Blazor Server Side使用FindView找不到cshtml文件 求邮件模板渲染方案
问题解决方法
一、视图找不到的排查与修复
- 首先修正
FindView方法的入参:Razor视图引擎默认会自动补.cshtml后缀,传入的视图名不需要加后缀,将代码改为:var viewResult = _razorViewEngine.FindView(actionContext, "ConfirmUser", false); - 确认Blazor Server项目已注册Razor视图服务,在
Program.cs中添加以下配置:
若未注册该服务,RazorViewEngine不会正常初始化,自然无法检索视图文件。builder.Services.AddControllersWithViews(); - 检查cshtml文件的属性配置:右键点击文件→选择「属性」,将「生成操作」改为「内容」,「复制到输出目录」改为「如果较新则复制」,避免运行时文件未被部署到对应路径。
- 自定义路径优先使用
GetView方法:如果你的cshtml没有放在Views/ControllerName或Views/Shared默认目录下,建议直接用GetView指定绝对路径,示例:// 第一个参数为站点根路径相对的基础路径,第二个为视图文件名,路径根据你的实际存放位置调整 var viewResult = _razorViewEngine.GetView("~/Infrastructure/Email/ConfirmUser/", "ConfirmUser.cshtml", false);
二、修复cshtml语法错误
你当前的cshtml存在语法问题:HTML标签不能包裹在@{ }C#代码块中,且@model行末尾不需要加分号,修正后内容如下:
@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 />
三、更适配Blazor Server的替代方案
不用依赖MVC的cshtml视图体系,直接用Blazor原生的.razor组件渲染邮件HTML,完全避免路径查找问题,更贴合项目技术栈:
- 新建
ConfirmUserEmail.razorRazor组件,写模板内容和模型绑定,和cshtml语法基本一致。 - .NET 7及以上版本可使用官方自带的
IRazorComponentRenderer服务渲染组件为字符串,配置和调用示例:// Program.cs注册服务 builder.Services.AddScoped<IRazorComponentRenderer, RazorComponentRenderer>(); // 渲染代码 var parameters = new ComponentParameterCollection() .Add(p => p.Model, new ConfirmUserEmailViewModel { Name = "用户名", ConfirmUrl = "确认链接" }); string htmlContent = await _razorComponentRenderer.RenderComponentAsync<ConfirmUserEmail>(parameters); - 渲染得到的
htmlContent可以直接传入MailKit作为邮件正文使用。
内容的提问来源于stack exchange,提问作者GPGVM
相关产品推荐
相关产品推荐

