我需要能够访问保存在 JavaScript 中的 C# 代码中的字符串。为了测试,我尝试在 JavaScript 中显示带有 C# 字符串的消息框(我使用这个字符串文字和消息框作为示例场景):
alert(<%: "TEST" %>);
当此代码运行时,不会显示任何消息框。另一方面,会显示一个消息框,其中包含以下代码:
alert(<%: 6 %>);
为什么我可以使用整数但不能使用字符串?有没有办法解决?
谢谢。
我需要能够访问保存在 JavaScript 中的 C# 代码中的字符串。为了测试,我尝试在 JavaScript 中显示带有 C# 字符串的消息框(我使用这个字符串文字和消息框作为示例场景):
alert(<%: "TEST" %>);
当此代码运行时,不会显示任何消息框。另一方面,会显示一个消息框,其中包含以下代码:
alert(<%: 6 %>);
为什么我可以使用整数但不能使用字符串?有没有办法解决?
谢谢。
您需要在字符串周围添加引号;否则,浏览器会看到alert(TEST);
,这是不正确的。为防止跨站脚本攻击,还需要对特殊字符进行适当的转义。调用HttpUtility.JavaScriptStringEncode
可以让你做到这两点:
alert(<%= HttpUtility.JavaScriptStringEncode("TEST", true) %>);
注意:如果此 JavaScript 片段出现在 HTML 属性中,如onclick
,您可能需要更改<%=
为,<%:
以便双引号也被 HTML 编码。
为什么我可以使用整数但不能使用字符串?
因为您需要将字符串放在引号中:
alert("<%: "TEST" %>");
与往常一样,这里的关键是查看浏览器实际接收到的内容。使用您的原始代码,浏览器看到的是:
alert(TEST);
...这是尝试使用变量 TEST
,而不是文字字符串。
现在在上面,我假设字符串中没有任何"
内容或其他在 JavaScript 字符串文字中无效的内容。这通常不是一个好的假设。
如果您使用的是最新版本的 .Net 或 JSON.Net(有关详细信息,请参阅此问题),您可以使用 JSON 序列化程序输出字符串,这将确保其中可能有问题的任何内容都被正确编码/转义. 例如,使用JSON.Net
,您可以使用:
// With JSON.Net
alert(<%: JsonConvert.ToString("TEST") %>);
// With a recent version of .Net
alert(<%: HttpUtility.JavaScriptStringEncode("TEST", true) %>);
问题在于如何将其转换为 JavaScript:
alert(<%: "TEST" %>);
变成
alert(TEST);
这是一个问题,因为它假设有一个名为TEST
您想要显示其值的变量,但很可能TEST
是未定义的。您可能想要做的是:
alert('<%: "TEST" %>');
但由于这是 MVC 4,您可以使用该Json.Encode
方法更简洁一些,如下所示:
alert(<%: Json.Encode("TEST") %>);
这两个都将转化为
alert('TEST');
这应该会显示一个带有字符串的消息框'TEST'
。