2017-02-17 11 views
-1

я пытаюсь создать строку с HTML кодом, чтобы использовать его, чтобы сделать телегустрока с ошибкой StingBuilder C#

for(var i=1; i<[email protected]; i++){ 

          sb.Append("<div class=\"ibox-content\">"+ 
             "<div class=\"table-responsive\">"+ 
              "<table class=\"table shoping-cart-table\">"+ 
               "<tbody>"+ 
                "<tr>"+ 
                 "<td width=\"90\">"+ 
                  "<div class=\"cart-product-imitation\">"+ 
                  "</div>"+ 
                 "</td>"+ 
                 "<td class=\"desc\">"+ 
                  "<h3>"+ 
                   "<a href=\"#\" class=\"text-navy\">"+ 
                    Model[i].Name+ 
                   "</a>"+ 
                  "</h3>"+ 
                  "<p class=\"small\">"+ 
                   Model[i].DescriptionLong+ 
                  "</p>"+ 
                  "<dl class=\"small m-b-none\">"+ 
                   "<dt>Description lists</dt>"+ 
                   "<dd>"+Model[i].DescriptionSort+"</dd>"+ 
                  "</dl>"+ 
                  "<div class=\"m-t-sm\">"+ 
                   "<a href=\"#\" class=\"text-muted\"><i class=\"fa fa-gift\"></i> Add gift package</a>"+ 
                   "|"+ 
                   "<a href=\"#\" class=\"text-muted\"><i class=\"fa fa-trash\"></i> Remove item</a>"+ 
                  "</div>"+ 
                 "</td>"+ 
                 "<td>"+ 
                  "$"+Model[i].Price+ 
                  "<s class=\"small text-muted\">$"+Model[i].DPrice+"</s>"+ 
                 "</td>"+ 
                 "<td width=\"65\">"+ 
                  "<input type=\"text\" class=\"form-control\" placeholder=\"1\">"+ 
                 "</td>"+ 
                 "<td>"+ 
                  "<h4>"+ 
                   "$"+(Model[i].Price)*(@Model[i].Count)+ 
                  "</h4>"+ 
                 "</td>"+ 
                "</tr>"+ 
              "</tbody>"+ 
             "</table>"+ 
            "</div>"+ 
          "</div>"); 
         }} 
        $("iboxTest").html(@sb); 
       } 

во второй раз внутри цикла я получаю сообщение об ошибке «System.OutOfMemoryException» в mscorlib .dll Я уменьшил размер строки, и она сработала. есть идеи?

+3

Моя идея: строковое значение слишком велико? Если вам нужно использовать такую ​​связку памяти для хранения строки, то в вашей архитектуре определенно неправильно. – pwas

+3

То, что вы делаете, довольно опасно. Вы должны попытаться создать нечто вроде частичного представления, которое будет действовать как шаблон для вашей тележки. –

+2

Посмотрите на шаблоны отображения. –

ответ

2

Вы используете StringBuilder, но вы также создаете слишком много строк.

Делать это:

sb.Append("<div class=\"ibox-content\">"+ 
    "<div class=\"table-responsive\">"+ 
     "<table class=\"table shoping-cart-table\">"+ 
      ...... 

вы добавите только один раз, но с использованием + (конкатенации), вы создаете много новых строк и получить OutOfMemoryException.

Код выше должен быть изменен на что-то вроде этого (добавить каждую строку с помощью StringBuilder.Append()):

sb.Append("<div class=\"ibox-content\">"); 
sb.Append("<div class=\"table-responsive\">"); 
sb.Append("<table class=\"table shoping-cart-table\">"); 
... 
+1

Использование StringBuilder для этого просто ужасно. –

+0

@OwenPauling, спасибо, я согласен с вами, но вопрос в том, почему существует «OutOfMemoryException». –

+0

'+' заменяется на 'string.Concat' во время компиляции (конечно, только тогда, когда это возможно), что намного лучше, чем' + '(без разборки памяти). Я бы предпочел использовать '+' вместо 'Append', когда' + 'count точно известен (как в этом случае, конкатенация в параметре' Append'). Я думаю, что проблема - это цикл 'for', который многократно добавляется в построитель строк, который ограничен памятью. – pwas