You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET MVC:Razor视图中单引号显示异常问题求助

关于Razor视图中Alert弹窗单引号变奇怪字符的原因解析

嗨,这个问题我之前踩过一模一样的坑!核心原因其实是Razor的自动HTML编码机制在搞鬼,咱们一步步拆解:

为什么从Razor变量取值会出问题?

Razor视图默认会对输出到页面的内容做HTML编码,目的是防止XSS攻击。当你的变量里包含单引号(')时,Razor会把它转成对应的HTML实体 ' —— 这个实体在HTML里会被解析成单引号,但如果直接塞进JavaScript字符串里,JS不会自动解码它,所以弹窗里就会显示成你看到的“以#开头的奇怪字符”(其实就是'的字面内容)。

举个错误写法的例子,一看就懂:

@{ var userMessage = "It's a Razor test"; }
<script>
// Razor编译后会把@userMessage转成It&#39;s a Razor test
alert('@userMessage'); // 弹窗显示:It&#39;s a Razor test
</script>

为什么直接传字符串正常?

当你直接在JS里写字符串时,你是遵循JavaScript的语法规则来处理单引号的:要么用双引号包裹带单引号的内容(alert("It's a test")),要么手动转义单引号(alert('It\'s a test'))。这时候没有经过Razor的编码,自然显示正常。

怎么解决这个问题?

要让Razor输出符合JavaScript语法的字符串,得用正确的转义方式:

  • .NET Framework项目:用Json.Encode配合Html.Raw,前者把字符串转成合法的JS格式,后者避免Razor二次编码:
    @{ var userMessage = "It's a Razor test"; }
    <script>
    alert(@Html.Raw(Json.Encode(userMessage)));
    </script>
    
  • .NET Core/.NET 5+项目:直接用Json.Serialize就行,它输出的内容本身就是合法的JS字符串,Razor不会额外编码:
    @{ var userMessage = "It's a Razor test"; }
    <script>
    alert(@Json.Serialize(userMessage));
    </script>
    

这样处理后,弹窗里的单引号就能正常显示啦!

内容的提问来源于stack exchange,提问作者aj go

火山引擎 最新活动