You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:15:37