.NET Core Razor页面字符串插值编译异常问题咨询
Razor页面中插值字符串含引号编译失败问题
以下Razor(.cshtml)代码无法编译:
@($"{\"\\\"\"}") // <-- 无法运行 @($"{\"'\"}") // <-- 无法运行 @($"{\"a\"}") // <-- 可运行
报错信息如下:
RZ1000: 未终止的字符串文本。以引号(")开头的字符串必须在行尾前终止。不过,以@和引号(@"")开头的字符串可以跨多行。
CS1002: 应输入 ;
CS1513: 应输入 }
观察发现,插值内容为非引号字符时可正常运行,但即使引号已转义,插值双引号或单引号会导致Razor解析失败。但相同逻辑的代码在普通.cs文件中可正常编译运行:
public sealed class Test { public string x = $"{\"\\\"\"}"; public string y = $"{\"'\"}"; public string z = $"{\"a\"}"; }
环境信息:
- .NET SDK: v7.0.102
- .NET Runtime: v7.0.2
- C#: v11 (预览版)
- Visual Studio Community 2022 (64位): v17.4.4
问题原因与解决方案
这是因为Razor解析器的优先级和普通C#代码不同:Razor会先识别视图中的HTML/模板语法,再处理C#代码。当你在插值字符串里嵌套转义引号时,Razor解析器会提前将\"识别为模板中的双引号终止符,而非C#的转义字符,导致字符串被错误截断,引发未终止字符串的报错。
解决方法:
- 混合使用单双引号区分层级:
利用Razor对单/双引号的识别差异,避免转义冲突:@($'{\"\"}') // 输出双引号 @($"{'\''}") // 输出单引号 - 使用字符字面量替代嵌套字符串:
直接插入字符而非嵌套字符串,减少转义层级:@($"{'"'}") // 输出双引号 @(${"'"}") // 输出单引号 - 提前定义变量再引用:
在代码块中先处理好带引号的字符串,再在视图中使用,彻底避免解析冲突:@{ var quote = $"{\"\\\"\"}"; } @quote
内容的提问来源于stack exchange,提问作者user3163495
相关产品推荐
相关产品推荐

