使用Razor替换HTML邮件模板变量时访问对象属性报错求助
报错核心原因
object does not contain a definition for ProductLink 是典型的类型不匹配问题:
- 原有可正常运行的模板中,
Model.ProductList是字符串类型集合,foreach 循环里的item被识别为 string 类型,直接输出@item(纯链接字符串)自然可以正常工作 - 你新增了
EmailProductLink实体类,但没有同步修改两处关键配置:一是传入模板的ProductList数据源没有换成List<EmailProductLink>强类型集合,二是实体类默认是 internal 访问权限,跨程序集渲染时 Razor 无法识别属性;最终 Razor 会把循环里的item推断为 object 类型,运行时自然找不到你定义的ProductLink、ProductName属性。
修复步骤
1. 修正实体类访问修饰符
你定义的实体类默认是 internal 级别,如果模板渲染逻辑和实体类定义不在同一个项目/程序集,Razor 会无法访问属性,必须加上 public 修饰符:
public class EmailProductLink { public string ProductName { get; set; } public string ProductLink { get; set; } }
2. 修正传入模板的模型数据
构造邮件模型时,把 ProductList 的赋值从原来的字符串集合替换为 List<EmailProductLink> 类型的强类型集合,注意 ProductLink 只存纯链接字符串,不要提前包裹 <a> 标签:
// 构造邮件模型示例 var emailModel = new { Document = documentData, // 原有文档相关赋值保持不变 ProductList = new List<EmailProductLink> { new EmailProductLink { ProductName = "商品名称", ProductLink = "https://example.com?productid=4321" } // 其余商品项按实际业务数据填充 } };
注意:不要用匿名类型作为集合元素传入,匿名类型默认是 internal 级别,跨程序集渲染同样会出现属性找不到的问题。
3. 修正Razor模板代码
给循环变量显式指定类型,避免 Razor 类型推断出错,修改后的循环片段如下:
<p>Our test code: @foreach (EmailProductLink item in Model.ProductList) { <span>Your product of choice: <a href="@item.ProductLink" rel="nofollow noreferrer">@item.ProductName</a></span> } end of test code </p>
如果你用的是 RazorEngine 等第三方 Razor 渲染库做邮件生成,可以在模板最顶部增加一行强类型模型声明,从根源避免类型推断错误:
@model 你的最外层邮件模型的完整类型名
常见踩坑提醒
- 不要给
ProductLink属性提前赋值带<a>标签的 HTML 内容,否则 Razor 默认会对 HTML 字符串做转义,最终渲染成普通文本而非可点击链接 - 如果修改后仍报错,检查传入
ProductList的实际运行时类型,确认集合内所有元素都是EmailProductLink实例,没有混入字符串或其他类型的对象。
内容的提问来源于stack exchange,提问作者Giancarlo
相关产品推荐
相关产品推荐

