C#StringBuilder AppendFormat引发System.FormatException

时间:2018-10-31 11:15:44

标签: c# razor stringbuilder

我有此方法,下面对此方法进行了简化,以重现该问题,任何人都可以解释为什么抛出系统格式异常吗?

我曾尝试将@添加到格式字符串的开头,以防转义字符出现问题,但这没有帮助。

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);
}

有一些背景知识,我们正在使用此代码生成用于Web应用程序的cshtml页面,因此stringbuilder最初包含一些html,然后在format部分中添加了一些C#MVC Razor。

1 个答案:

答案 0 :(得分:7)

  

谁能解释为什么抛出系统格式异常?

是:您的格式字符串包括以下内容:

{ <text>StateNonEditable</text> }

这不是有效的格式项。您需要通过将它们加倍来逃避不是属于格式项的括号:

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

或者,只需调用一次AppendFormat,然后一次调用Append

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

老实说,这可能是一种更具可读性的解决方案。