string.Format在HTML + javascript中抛出System.Format异常

7
我将在只读字符串上运行 string.Format,该字符串包含一些HTML+ javascript,但是我却收到了一个System.FormatException的错误提示。
这是我的格式化字符串:
<script type="text/javascript">
    function {0}_showHideFieldWindow() {
        if ({0}.IsCustomizationWindowVisible()) {
            {0}.HideCustomizationWindow();
        } else {
            {0}.ShowCustomizationWindow();
        }
    }
</script>

我所做的只是传递对象名称。就像这样:

string.Format(javascript, "grid");
2个回答

12

由于字符串中包含花括号,您需要将它们转义为双倍符号({{}}),以防格式化程序认为它们是令牌。

您的字符串初始化应该类似于以下内容:

String javascript = @"<script type=""text/javascript"">
            function {0}_showHideFieldWindow() {{
            if ({0}.IsCustomizationWindowVisible()) {{
                {0}.HideCustomizationWindow();
            }} else {{
                {0}.ShowCustomizationWindow();
            }}
        }}
    </script>";

1
只是出于好奇,C#中的标准转义字符不是反斜杠(\)吗?也就是说,花括号应该用"{}"进行转义,而不是"{{}}"吧?我确实知道双括号可以工作,但这是最佳实践吗? - Tomas Aschan
4
因为他在字符串前使用了 @ 符号,所以反斜杠会被解释为反斜杠本身,因此没有任何字符会被转义。 - John Rasch
1
约翰是正确的 - 因为这是一个逐字字符串,所以有一些转义字符可以使用,所有这些都涉及将字符加倍(即 { 变成 {{," 变成 "" 等)。 - Andrew Hare
2
反斜杠用于转义非法的C#字符。花括号在C#字符串中是合法的,它是string.Format方法期望以自己的合法格式提供字符串。 - James Couvares
3
@Tomas:反斜杠(\)在字符串文字中是转义字符——也就是说,它用于将“特殊”字符输入到字符串文字中。然而,对于格式化字符串,你需要双写想要转义的字符。为什么?因为API就是这么规定的。API设计者为什么这么做呢?可能是因为他们还必须让使用VB.Net的人也能够使用该功能。哪种方式更容易——向VB用户解释如何输入 {,还是向C#用户解释如何使用{{?我猜后者更容易一些。 - Jonathan Rupp
显示剩余2条评论

6

String.Format需要额外的括号进行转义。如果您不需要String.Format的所有功能,您可以考虑使用以下方法,这可能比逐个转义括号更易读:

mystring.Replace("{0}","grid");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接