RazorEngine模板编译遇TemplateCompilationException,求解决方案
解决RazorEngine模板编译异常:
var和cmpData不存在的问题 你遇到的编译错误核心是Razor模板的语法结构不正确,导致代码逻辑没有被引擎正确识别为服务器端代码块。咱们一步步拆解问题并解决:
错误原因分析
名称‘var’在当前上下文中不存在:你直接在模板里写了@var cmpData = new JArray();,但Razor引擎会把@var当成要输出的文本内容,而非服务器端执行的代码。Razor中,多行或复杂逻辑必须包裹在@{ ... }代码块内。名称‘cmpData’在当前上下文中不存在:因为cmpData的定义不在正确的代码作用域内,后续引用时自然找不到这个变量。
修正后的代码实现
调整模板语法
把所有逻辑放在代码块中,并且通过@输出最终结果:
string template = @" @{ var cmpData = new JArray(); foreach (var cmp in Model) { cmpData.Add(cmp[""Name""]); } @cmpData // 输出最终生成的JArray }";
优化调用逻辑
确保传入模型的类型明确,这里我们指定JArray作为模型类型,让引擎更准确地处理:
var result = Engine.Razor.RunCompile(template, "templateKey", typeof(JArray), array); // 打印结果验证 Print(result);
额外优化建议
- 改用强类型模型:尽量避免动态类型,定义实体类接收反序列化后的JSON,模板代码会更清晰且易维护:
public class Company { public string CompanyID { get; set; } public string Name { get; set; } public string DepartmentName { get; set; } public DateTime ModifiedDate { get; set; } } // 反序列化时使用强类型 List<Company> companies = JsonConvert.DeserializeObject<List<Company>>(jsonCompany); // 模板中可直接访问cmp.Name,无需处理JObject索引
查看临时编译文件:如果仍有问题,可打开临时路径
C:\Users\admin\AppData\Local\Temp\RazorEngine_vf4meokh.w1x下的生成代码,查看具体编译错误位置,精准定位问题。确认RazorEngine版本:部分旧版本对动态类型和代码块的处理存在兼容性问题,建议使用较新的稳定版本。
内容的提问来源于stack exchange,提问作者Nirmal Patel
相关产品推荐
相关产品推荐

