C# stringbuilder appendformat, выбрасывающий system.formatexception

У меня есть этот метод, который я упростил, чтобы воспроизвести проблему, может ли кто-нибудь объяснить, почему возникает исключение системного формата?

Я попытался добавить @ в начало строки формата на случай, если возникла проблема с escape-символами, но это не помогло.

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

Немного предыстории, мы используем этот код для создания страницы cshtml для использования в веб-приложении, поэтому построитель строк изначально содержит некоторый html, а затем мы добавляем немного C# MVC Razor в раздел форматирования.

удалите @ из внутренней строки и попробуйте

Md. Abdul Alim 31.10.2018 12:17

дублировать с stackoverflow.com/questions/6951479/…

Mehrdad 31.10.2018 12:23

@Patrick Hofman, спасибо, я искал ошибки исключения формата, но не встречал их, так как не знал, как искать фигурную скобку: P

MysticVagabond 31.10.2018 12:24
1
3
675
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

can anyone explain why the system format exception is thrown?

Да: ваша строка формата включает следующее:

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

Честно говоря, это, наверное, более читаемое решение.

Другие вопросы по теме