Umbraco 8.1创建Sitemap报CS1525: Invalid expression term '<'错误
报错原因
CS1525: Invalid expression term '<' 是Razor视图解析阶段抛出的错误:你在@{ }C#代码块内定义的局部方法中直接编写XML标签,本地调试时IIS Express默认使用运行时动态编译视图,可以正常识别代码块内嵌的标签标记;站点部署到生产环境后,若开启了视图预编译、或运行时Razor解析配置与本地不一致,解析器会把XML开头的<识别为C#代码中的小于运算符,而非输出标记的起始符号,直接触发解析错误。
修复方案
方案1:用标签显式标记输出内容(改动最小)
Razor提供的<text>标签不会被输出到最终响应内容中,仅用于告知解析器标签包裹的内容是需要直接输出的原生标记,不属于C#代码逻辑。修改后的方法代码如下:
@{ void RenderSiteMapUrlEntry(IPublishedContent node) { var changeFreq = node.Value("searchEngineChangeFrequency", fallback: Fallback.To(Fallback.Ancestors, Fallback.DefaultValue), defaultValue: "monthly"); // 相对优先级为单页独立设置,不做递归继承,无值时默认0.5 var priority = node.HasValue("searchEngineRelativePriority") ? node.Value("searchEngineRelativePriority") : "0.5"; <text> <url> <loc>@node.Url(mode: UrlMode.Absolute)</loc> <lastmod>@(string.Format("{0:s}+00:00", node.UpdateDate))</lastmod> <changefreq>@changeFreq</changefreq> <priority>@priority</priority> </url> </text> } }
方案2:拼接XML字符串后输出(兼容性最高)
如果方案1在生产环境依然触发解析错误,可以完全避开在C#代码块中直接写XML标签,将节点内容拼接为字符串后通过Html.Raw()输出,彻底避免解析器混淆代码和标记:
@{ void RenderSiteMapUrlEntry(IPublishedContent node) { var changeFreq = node.Value("searchEngineChangeFrequency", fallback: Fallback.To(Fallback.Ancestors, Fallback.DefaultValue), defaultValue: "monthly"); var priority = node.HasValue("searchEngineRelativePriority") ? node.Value("searchEngineRelativePriority") : "0.5"; var absoluteUrl = node.Url(mode: UrlMode.Absolute); var updateTime = string.Format("{0:s}+00:00", node.UpdateDate); var entryContent = $@" <url> <loc>{absoluteUrl}</loc> <lastmod>{updateTime}</lastmod> <changefreq>{changeFreq}</changefreq> <priority>{priority}</priority> </url>"; Html.Raw(entryContent); } }
方案3:排查生产环境部署配置
如果代码修改后问题仍存在,逐一检查以下配置项:
- 发布站点时取消勾选「预编译视图」选项,视图预编译的解析逻辑和运行时动态编译存在差异,很容易触发这类标签识别错误
- 确认生产环境Views目录下的站点地图视图文件已完整覆盖部署,无旧版本文件残留、文件缺失问题
- 确认生产环境Web.config中配置的Razor页面版本与本地开发环境一致,无版本不匹配问题
额外注意:站点地图视图需要在文件开头设置响应头为XML格式,添加代码
Response.ContentType = "application/xml";,避免浏览器按HTML格式解析返回内容。
内容的提问来源于stack exchange,提问作者Spar
相关产品推荐
相关产品推荐

