如何让FluentEmail的RazorRenderer忽略未映射的模型属性?
解决方案
Razor解析器默认是强类型校验机制,访问模型中不存在的属性时会抛出RuntimeBinderException。针对你的需求,有两种实用方案可以避免报错:
方案一:用动态对象包装原始模型,拦截无效属性访问
创建一个继承DynamicObject的安全包装类,重写属性访问逻辑——当找不到对应属性时,返回空字符串(或保留原占位符文本),而非抛出异常。
代码实现
public class SafeModelWrapper : DynamicObject { private readonly object _model; private readonly PropertyInfo[] _modelProperties; public SafeModelWrapper(object model) { _model = model; _modelProperties = model.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); } public override bool TryGetMember(GetMemberBinder binder, out object result) { // 查找匹配的属性(忽略大小写) var property = _modelProperties.FirstOrDefault(p => string.Equals(p.Name, binder.Name, StringComparison.OrdinalIgnoreCase)); if (property != null) { result = property.GetValue(_model) ?? string.Empty; return true; } // 找不到属性时返回空字符串,若要保留原占位符,可改为 result = $"@Model.{binder.Name}" result = string.Empty; return true; } }
使用方式
将原始模型包装为动态对象后传入解析方法:
dynamic safeModel = new SafeModelWrapper(placeholderData); var parsedContent = await razor.ParseAsync(emailContent, safeModel);
方案二:配置RazorLight引擎容忍缺失属性
FluentEmail的RazorRenderer底层依赖RazorLight,你可以自定义RazorLightEngine实例,开启AllowMissingProperties选项,让解析器访问不存在的属性时返回null而非报错。
代码实现
// 初始化带自定义配置的RazorLight引擎 var razorEngine = new RazorLightEngineBuilder() .UseMemoryCachingProvider() .SetOperatingAssembly(typeof(YourProjectClass).Assembly) .Configure(options => { options.AllowMissingProperties = true; }) .Build(); // 用自定义引擎创建RazorRenderer var razorRenderer = new RazorRenderer(razorEngine); // 正常解析即可,无效占位符会被替换为null var parsedContent = await razorRenderer.ParseAsync(emailContent, placeholderData);
补充
如果不想显示null文本,可以在邮件模板中用Razor空合并运算符处理:
Thank you @(Model.FrstName ?? "") for submitting!
内容的提问来源于stack exchange,提问作者Paritosh
相关产品推荐
相关产品推荐

