2012-01-14 14 views
1

これまでのところ、実行時に動的にASP.NETページにコントロールを追加するために使用できるLiteralControlPlaceHolderがあります。追加する代わりに書き込むasp.netコンポーネントがありますか

我々は

LiteralControl.Text = "Some HTML/Text" 

を使用してPlaceHolderのために私たちは、私は私が私がResponse.Write(...)で何をすべきかのようにそれに書き込むことができるコンポーネントを探しています

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

を使うLiteralControlにHTMLコードを追加するには私はそれをページの指定された場所に書き込む必要があります。メモリを節約するために、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")) 

それは私がそれに追加して、再び、それは私のために制限されていることを多くのメモリを使用するHTMLの各チャンクのための1 LiteralControlを作成するためのオプションではありません。

イントラネットWebサイトでは、1秒間に約500件のコールが発生し、メモリ使用量が急激に増加し、IISが他のアプリケーションの要求に応答しなくなります。各HTML要素のための単一のLiteralControlオブジェクトを作成する問題について

+0

おそらく、jQueryで 'div'を使用すると役に立ちますか? –

+0

LiteralControlの動作をもっと速くしたいのですか? Renderの呼び出しは単にoutput.Write(this._text)なので、どのように高速化され、まだ(よく動作する)コントロールになるのかはわかりません。おそらく<%= foo %>はあなたにとってより適していますか? –

+1

@ JamesManning、あなたのアイデアをありがとう、 'LiteralControl'は高速ですが、その入力は文字列であり、その出力への追加は文字列' + 'です。私は 'DOT.NET'が非常に遅い文字列を扱っていることを知っていると確信しています。私が探しているケースは、ページの指定された領域に直接書き込むLiteralControl.Append( 'Some HTML/Text')です。 – AaA

答えて

1

だから私はそのような内部ASP.NETコンポーネントを認識していません。この問題については

私は3ソリューション提案:

  • 使用伝統的なResponse.Write(...)をしていると、すべてを書きます。マスターページを使用している場合や他のコンポーネントがある場合は、 メモリにコピーを作成し、その部分出力をレスポンス バッファに書き込んだ後、コードの一部とページの残りの部分を書き込むことができます。
  • 第三者コンポーネントを使用してこの問題を処理します。
  • または、独自のコンポーネントをPlaceHolderから継承し、出力をRenderメソッドで生成します。あなたの出力をレスポンスバッファに直接書き込み、コンポーネントコード自体よりもメモリを使用していません。 (これは私が自分自身の同様の問題を解決する方法である)を検討する

もう一つは、あなたのデータは何の多くを変更している場合は、あまりにもIISのヒットを減らすために、あなたのページをキャッシュすることはできませんです。

0

、あなたが最初にあなたのHTML要素のすべてをレンダリングするためにHtml32TextWriterを使用して、ページの上に置くために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)); 
+0

私の質問をよくお読みください!私が 'PlaceHolder'に追加しようとしているHTMLコードの各チャンクに対して1つのリテラルコントロールを作成すると言ったのは私の欠点です。 私が説明したように、HTMLコードの小さな塊を出力に追加して、サーバーのメモリ使用量を減らし、HTTPバッファに追加する前にメモリに作成された大きな文字列を追加するよりも高速です。 – AaA

+0

私はあなたがHtmlTextWriterを使ってあなたの全体の所望の要素を構築し、最後に対応するhtml出力を得て、それを「単一の」LiteralControlとして追加することができたので、いくつかのLiteralControlを使用することを意味しませんでした。 "バッファリングされていない応答"を使用してサーバー上の応答バッファを小さくする方法は、全く異なる質問です。 – sos00

+0

'StringBulder.ToString()'を直接使うことができます。あなたのソリューションは、sb.Appent( "..."); placeHolder.Controls.Add(new LiteralControl(sb.ToString()))で簡単になります。 IISバッファメモリは大きな問題ではなく、ASP.NETメモリは大きな問題です。私のASP.NETプロセスは時々1を消費します。私の記憶とISSの5gigは同時に200megsしか使用しません。 – AaA

関連する問題