1

我需要能够访问保存在 JavaScript 中的 C# 代码中的字符串。为了测试,我尝试在 JavaScript 中显示带有 C# 字符串的消息框(我使用这个字符串文字和消息框作为示例场景):

alert(<%: "TEST" %>);

当此代码运行时,不会显示任何消息框。另一方面,会显示一个消息框,其中包含以下代码:

alert(<%: 6 %>);

为什么我可以使用整数但不能使用字符串?有没有办法解决?

谢谢。

4

3 回答 3

5

您需要在字符串周围添加引号;否则,浏览器会看到alert(TEST);,这是不正确的。为防止跨站脚本攻击,还需要对特殊字符进行适当的转义。调用HttpUtility.JavaScriptStringEncode可以让你做到这两点:

alert(<%= HttpUtility.JavaScriptStringEncode("TEST", true) %>);

注意:如果此 JavaScript 片段出现在 HTML 属性中,如onclick,您可能需要更改<%=为,<%:以便双引号也被 HTML 编码。

于 2013-06-14T21:01:07.240 回答
0

为什么我可以使用整数但不能使用字符串?

因为您需要将字符串放在引号中:

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) %>);
于 2013-06-14T21:00:52.403 回答
0

问题在于如何将其转换为 JavaScript:

alert(<%: "TEST" %>);

变成

alert(TEST);

这是一个问题,因为它假设有一个名为TEST您想要显示其值的变量,但很可能TEST是未定义的。您可能想要做的是:

alert('<%: "TEST" %>');

但由于这是 MVC 4,您可以使用该Json.Encode方法更简洁一些,如下所示:

alert(<%: Json.Encode("TEST") %>);

这两个都将转化为

alert('TEST');

这应该会显示一个带有字符串的消息框'TEST'

于 2013-06-14T21:01:23.907 回答