2011-08-15 6 views
3

私はASP.NetのParseControlメソッドを使用して、外部データソースからのHTMLとサーバーの混在したコントロールコードを描画しています。インラインコードブロックをサポートしていないParseControlの回避策?

これはうまくいきますが、ParseControlはインラインスクリプトブロック(< %%>)をサポートしていないようですが、単純な代替方法や回避策があるのでしょうか?ここでは簡単な一例です(現実世界の実装では、より複雑です):

string externalCodeString = "<div><%= DateTime.Now %></div>"; 
Control control = ParseControl(externalCodeString); 
placeholder.Controls.Add(control); 
+0

日付を含むdivのみを出力するときに、なぜParseControlを使用していますか?実際の例はより複雑ですか? –

+0

はい、ずっと複雑です:) – TimS

+0

あなたはあなたの質問に答えて、もう少し文脈を提供できますか? –

答えて

2

ParseControlは確かにコードブロックをサポートしていません。

代わりに、VirtualPathProviderによって提供されるUserControlに依存するより複雑なアプローチがあります。

あなたは理論的にParseControlのような単純なAPIにラップすることができますが、実際にはユーザーコントロールをコンパイルします。

すべての呼び出しでコンパイルが終了しないようにするには、適切なキャッシングが必要です。動的言語は、あなたの質問に与えられたコンテキストに基づいて、このような何か:)

+0

素晴らしい、ありがとう! – TimS

-1

はこれを試してみてください:それは、コンパイルの原因となることがないので

placeholder.Controls.Add(new LiteralControl(String.Format("<div>{0}</div>", DateTime.Now))); 
+0

コードは外部データソースから来ているので、コードがインラインである必要があります(もちろんこれが可能な場合)。上記のように文字列置換を使用することを検討しましたが、置換可能な変数の数が膨大になるため、保守不能になります。 – TimS

+0

私は混乱しています...あなたの例はインラインコーディングの要件をどのように満たしていますか?そのコードはスクリプトブロックなのでしょうか? –

+0

はい、外部ソースからの文字列の中にASP.Net <% %>スクリプトブロックがいくつかあります。申し訳ありませんが、誤った用語を使用している場合は、Qを更新する必要がありますか? – TimS

1

のためのより良い仕事と

、これはうまくいくかもしれない - あなたはまだ言及していない可能性があります制限がある場合を除きます。

代わりにPage.LoadControlを使用できるように、まずディスクに書き込むことはできますか?

など。外部データソースを取得し、ユニークなファイルにストリームします(必要に応じてGUID名を付けるか、タイムスタンプに名前を付ける、または入力文字列のハッシュをベースにします)。Page.LoadControl(pathToFile)を使用して、ファイルの場所をパラメータ。

文字列のハッシュに基づいてファイルの名前を付けることのメリットは、繰り返し入力された場合に同じ入力に対して書き直しを保存することができることです。

ある時点で、未使用のファイルを削除するクリーンアッププロセスが必要になります。

1

インラインコードのRazor構文に切り替えることは可能ですか?はいの場合は、Razor View Engineを使用してそれを解析するよりも(Hosting the Razor Engine for Templating in Non-Web Applications)です。

ます。また、HTMLを解析し、発光するように razor templating engineを使用するには、この簡単に使用することができます

string template = "<div>@DateTime.Now</div>"; 
    string result = Razor.Parse(template, new { Prop1 = "someValue" }); 

    placeholder.Controls.Add(new LiteralControl(result)); 
+0

スクリプトはすでにASP.Net/C#構文になっていますが、良い代替案です。ありがとうございます。 – TimS

1

無コンパイルページにコードを持つことができないという制限があります。

http://www.asp.net/learn/whitepapers/ironpython

初期の段階にある新しいIronPythonのは、ソリューションです:

パーサはコードスニペット(<% ...%>が発生した場合、<% = ... %>、または<%# ...%>)、スニペットを コードを保持する特別なコントロールに置き換えます。ASP.NETの観点からは、コードはありません。スニペット はちょうど コードの文字列プロパティを持つコントロールになります。これは、コンパイルしないページ がコードを持つことができないという制限を回避する方法です。

関連する問題