3

ASP.NetのParseControlメソッドを使用して、外部データソースからのHTMLとサーバー制御コードの混合をレンダリングしています。

これはうまく機能していますが、ParseControlはインラインスクリプトブロック(<%%>)をサポートしていないようです。これに対する簡単な代替手段または回避策があるかどうか疑問に思っていますか?これが1つの簡単な例です(実際の実装はより複雑です):

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

5 に答える 5

2

ParseControlは、コンパイルを引き起こさないため、実際にはコードブロックをサポートしていません。

動作するはずですが、より複雑な1つのアプローチは、代わりにVirtualPathProviderによって提供されるUserControlに依存することです。

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

すべての呼び出しでコンパイルされてパフォーマンスが低下しないように、適切なキャッシュを実行する必要があります。

動的言語はこのようなものに適しています:)

于 2011-08-19T20:00:47.843 に答える
1

あなたの質問で与えられた文脈に基づいて、これはうまくいくかもしれません-あなたがまだ言及していないかもしれない制限がない限り。

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

たとえば、外部データソースを取得し、それを一意のファイルにストリーミングし(必要に応じて、GUID名を付けるか、タイムスタンプ、または受信文字列のハッシュに基づいて名前を付けます)、を使用Page.LoadControl(pathToFile)して、ファイルの場所をとして渡します。パラメータ。

文字列のハッシュに基づいてファイルに名前を付けることの利点は、ファイルが繰り返された場合でも、まったく同じ入力に対してファイルを書き直す手間を省けることです。

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

于 2011-08-19T20:05:27.900 に答える
1

インラインコードをRazor構文に切り替えることは可能ですか?はいの場合は、Razor View Engineを使用して解析できます(Web以外のアプリケーションでテンプレートを作成するためのRazor Engineのホスティング)

この使いやすいかみそりテンプレートエンジンを使用して、HTMLを解析して出力することもできます。

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

  placeholder.Controls.Add(new LiteralControl(result));
于 2011-08-22T21:40:50.450 に答える
1

コンパイルなしのページにコードを含めることはできないという制限があります。

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

初期段階にある新しいIronPythonは解決策です:

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

于 2011-09-05T10:09:07.010 に答える
-1

これを試してみてください:

placeholder.Controls.Add(new LiteralControl(String.Format("<div>{0}</div>", DateTime.Now)));
于 2011-08-15T15:06:31.203 に答える