C#StringBuilder AppendFormat抛出System.FormatException

Mys*_*ond 1 c# stringbuilder razor

我有这个方法,我已经简化了重现问题,任何人都可以解释为什么抛出系统格式异常?

我已经尝试将@添加到格式字符串的开头,以防万一它是转义字符的问题,但它没有帮助.

private void doThing(StringBuilder builder, string inPrimaryKey) {
    // At this point the builder.ToString() results in "            <div  class="v-group width-100 shadowed OrderPanel"
    // and inPrimaryKey is "OrderId"

    // Throws System.FormatException with the detail "Input string was not in a correct format."
    builder.AppendFormat(@" @if (Model.{0} > 0) { <text>StateNonEditable</text> } else { <text>StateEditable</text> }", inPrimaryKey);
}
Run Code Online (Sandbox Code Playgroud)

有点背景,我们使用这段代码生成一个cshtml页面供web应用程序使用,所以stringbuilder最初包含一些html,然后我们在格式部分添加了一些C#MVC Razor.

Jon*_*eet 7

任何人都可以解释为什么抛出系统格式异常?

是的:您的格式字符串包括:

{ <text>StateNonEditable</text> }
Run Code Online (Sandbox Code Playgroud)

这不是有效的格式项.你需要通过加倍来逃避应该成为格式项的一部分的大括号:

builder.AppendFormat(
    " @if (Model.{0} > 0) {{ <text>StateNonEditable</text> }} else {{ <text>StateEditable</text> }}",
    inPrimaryKey);
Run Code Online (Sandbox Code Playgroud)

或者,只需拨打AppendFormat一次,然后Append再拨一次:

builder.AppendFormat(" @if (Model.{0} > 0 ", inPrimaryKey)
       .Append("{ <text>StateNonEditable</text> } else { <text>StateEditable</text> }");
Run Code Online (Sandbox Code Playgroud)

说实话,这可能是一个更具可读性的解决方案.