.NET 7中使用FluentEmail的UseTemplateFromFile()出现参数数量不匹配问题
问题描述
在.NET 7项目中使用FluentEmail结合Razor模板发送用户邮件时,持续触发TargetParameterCountException: Parameter count mismatch.错误,怀疑是.UsingTemplateFromFile()方法导致。
项目配置(Startup.cs)
services.AddFluentEmail("noreply@rackemapp.com") .AddRazorRenderer() .AddSmtpSender(smtpsettings["Server"], Convert.ToInt32(smtpsettings["Port"]), smtpsettings["Username"], smtpsettings["Password"]);
控制器发送邮件代码
项目命名空间为RackEmApp,模板位于/Views/EmailTemplates目录:
var path = Directory.GetCurrentDirectory(); var email = FluentEmail.Core.Email .From("test@test.com") .To(sendto) .Subject(subject) .UsingTemplateFromFile(Directory.GetCurrentDirectory() + "/Views/EmailTemplates/NewUserAdminNotification.cshtml", mergefields);
可能的原因及解决方法
Razor模板模型类型不匹配
检查NewUserAdminNotification.cshtml模板顶部的@model声明,确保其与传入的mergefields对象类型完全一致。例如模板声明@model RackEmApp.Models.UserNotificationModel,则mergefields必须是该类型的实例,不能是匿名对象或其他类型。UsingTemplateFromFile参数误用
FluentEmail的UsingTemplateFromFile方法针对Razor模板,要求传入单个模型对象,不能是多个零散参数。如果mergefields是多个值的集合而非统一实体类实例,就会触发参数不匹配错误。需将所有渲染字段封装到一个实体类中,传入该类的实例。模板路径拼接错误
虽然报错指向参数问题,但仍需验证模板路径是否正确。推荐使用Path.Combine拼接路径避免字符串拼接错误:var templatePath = Path.Combine(Directory.GetCurrentDirectory(), "Views", "EmailTemplates", "NewUserAdminNotification.cshtml");依赖版本不兼容
确认FluentEmail.Core、FluentEmail.Razor等相关包的版本与.NET 7兼容,更新到最新兼容版本可避免因版本差异导致的反射调用参数错误。
内容的提问来源于stack exchange,提问作者Matthew Warr

