Есть ли компонент asp.net, чтобы написать вместо добавления - PullRequest
1 голос
/ 14 января 2012

Пока я знаю, что у нас есть LiteralControl и PlaceHolder, которые мы можем использовать для динамического добавления элементов управления на страницу ASP.NET во время выполнения.

Чтобы добавить HTML-код в LiteralControl, мы используем

LiteralControl.Text = "Some HTML/Text"

и для PlaceHolder мы используем

PlaceHolder.Controls.Add(new LiteralControl("Some HTML/Text"))

Я ищу компонент, который можно записать в него, как то, что я делаю с Response.Write(...), но мне это нужно длянаписать в обозначенном месте на странице.Мне нужно вызывать это много раз, чтобы отправлять небольшие куски HTML-кода на выход для экономии памяти.

Таким образом, использование компонента будет примерно таким:

на странице aspx, которую я добавлю:

<body>
...
<div>
<asp:componentName ID="SomeComp" runat="server" />
</div>
...
</body>

И в своем коде я буду использовать это ( Представьте большое число для SetCount ):

for (int i;i<SetCount;i++){
  SomeComp.Write("Some Text/HTML Code");
}
While(Read.Read()){
  SomeComp.Write("Some More Text/HTML Code");
}

FYI Добавление к строкам в DOT.NET очень медленный, поэтому LiteralControl не является хорошим выбором.

Создание StringBuilder и использование

LiteralControl.Text = StringBuilder.ToString()

не вариант, поскольку он сохраняет всю строку в памяти, пока вы ее не назначитеуправлять и распоряжаться им.

PlaceHolder.Controls.Add(new LiteralControl("Some HTML/Text"))

не вариант, потому что он создает один LiteralControl для каждого фрагмента html, который я добавляю в него, и снова он использует много памяти, которая для меня ограничена.

Мой веб-сайт интрасети имеет около 500 вызовов на одну и ту же страницу в секунду, и это вызывает огромный всплеск использования памяти, из-за которого IIS перестает отвечать на запросы других приложений.

Ответы [ 2 ]

1 голос
/ 15 января 2012

Пока что мне не известен такой внутренний компонент ASP.NET.

Для этого вопроса я предлагаю 3 решения:

  • Используйте традиционный Response.Write(...) и напишите все с этим. если вы используете мастер-страницу или у вас есть другие компоненты. вы можете создать копию в памяти и затем записать ее частичный вывод в Response Затем введите буфер, затем введите свою часть кода, а затем остаток страницы.
  • Используйте сторонний компонент для решения этой проблемы
  • Или напишите свой собственный компонент, унаследуйте его от PlaceHolder и сгенерируйте свой вывод в методе Render. он напрямую записывает ваш вывод в Response Buffer и не использует память больше, чем сам код компонента. (так я решил свою собственную подобную проблему)

Еще одна вещь, которую следует учитывать, - если ваши данные практически не меняются, вы можете кэшировать свою страницу, чтобы уменьшить количество обращений и к IIS.

0 голосов
/ 14 января 2012

для проблемы создания одного объекта LiteralControl для каждого html-элемента вы можете использовать Html32TextWriter, чтобы сначала отобразить все ваши html-элементы, а затем использовать LiteralControl, чтобы поместить его на страницу:

    var sb = new StringBuilder();
    var writer = new StringWriter(sb);
    var html = new Html32TextWriter(writer);

    html.RenderBeginTag(HtmlTextWriterTag.P);
    html.WriteEncodedText("paragraph1");
    html.RenderEndTag();
    ...
    ...
    html.Flush();

    var outputHtml = sb.ToString();

    placeHolder.Controls.Add(new LiteralControl(outputHtml));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...