質問:バックエンドコード(コードビハインドではなく実際のバックエンドクラス)で、Load(path)を使用せずに、.aspxまたは.ascxで定義されたページまたはコントロールをロードしてレンダリングすることは可能ですか?ページ/コントロールクラスのインスタンスを作成しますか?
私はこれを実行できるようにしたい(コードビハインドではなくバックエンドクラスから):
MyControl myCtl = new MyApp.Views.Shared.MyControl();
String html = Util.ControlToString(myCtl); //I get an empty string & hidden errors
これの代わりに
public static string ControlToString(string path)
{
Page pageHolder = new Page();
MyControl myCtl = (MyControl)pageHolder.LoadControl(path);
pageHolder.Controls.Add(myCtl);
StringWriter output = new StringWriter();
HttpContext.Current.Server.Execute(pageHolder, output, false);
return output.ToString();
}
詳細: Asp.net WebAppでは、ユーザーコントロール(.ascx)またはページ(.aspx)をHTML文字列としてレンダリングする必要がある場合があります。ページまたはコントロールがコードビハインドから継承する場合、そのクラスはバックエンドコードにインテリセンスで表示され、コンパイル時または実行時のエラーを発生させることなく、インスタンスを作成してプロパティを設定できます。ただし、ページまたはコントロールをレンダリングしようとすると、常に空の文字列が表示され、検査時に、物理ファイルパスを使用してページまたはコントロールをロードしない限り、ページまたはコントロールは抑制された内部レンダリングエラーを示します。
重要な問題は、.aspx/.ascxファイルが実行時にコンパイルされるタイミングと方法に関係していると思います。コンパイル済みのユーザーコントロールのクラスライブラリを作成したくないのは、デザインプロセスが煩雑になるためです。また、.aspx / .ascxページで提供されるデザイナー機能が本当に気に入っているので、次の方法を見つけたいと思います。ページをソリューションでコンパイルして、他のバックエンドクラスと同じように使用できるようにしますが、デザイナーを使用して作成することもできます。両方の長所を(1)デザイナーでページとコントロールを編集できるようにし、(2)インスタンスを作成し、バックエンドクラスを使用してそれらのプロパティを設定できるようにしたいと思います。