1

私が知りたいのは、レンダリング中にそのページのライフサイクルイベント(Page_Init、Page_Load)が呼び出されHttpContextたときに(Page_Init、Page_Load)が呼び出されるように、レンダリングにパラメーターを挿入する手法があるかどうかです。UserControlHttpContext.Current.Server.Execute()

このような手法を使用すると、動的レンダリングに特化しなくても、任意のUserControlにデータを挿入できます(たとえば、リモートサービスの呼び出しを介して)。ASPXページの静的コントロールであるかのようにロードされます。

このベースコードフラグメントから始めます。

Page page = new Page();
UserControl ctl = (UserControl)page.LoadControl(controlSpec);
page.Controls.Add(ctl);

// want to inject data into the control at this point

StringWriter writer = new StringWriter();
HttpContext.Current.Server.Execute(page, writer, true);
String renderedContent = writer.ToString();
return renderedContent;

@ScottGu ViewManagerの例を見てきました。彼は、それぞれにデータメンバーを追加しUserControls、コントロールがHTMLにレンダリングされる前に、リフレクションを使用してそのメンバーにデータソースを挿入します。

また、 Stefan Sedichが@ScottGuのViewManager<Control>例を取り上げて、同じことを可能にするがリフレクションの必要性を回避するジェネリックを導出しているのを見ました。

たとえば、をレンダリングする前に、RequestオブジェクトまたはQueryStringHttpContextのにパラメータを追加できるようにしたいと思いますUserControl

4

1 に答える 1

0

UserControl オブジェクトから継承するアプリケーション用の新しいコントロール基本クラスを作成することを検討したことがありますか?カスタム ユーザー コントロールは、ユーザー コントロールではなくそのクラスに基づいています。次に、コントロールからアクセスできる基本クラスのコントロールにデータを挿入するためのメソッドを作成できます。

public class DataDrivenUserControl : UserControl
{
// implement stuff here
}

コントロールはこのクラスから継承できます

DataDrivenUserControl ctl = (UDataDrivenUserControl)page.LoadControl(controlSpec);
page.Controls.Add(ctl);
ctl.InjectData(data);// or however you want to implement data injection methods

通常、1 つの関数の継承の深さを増やすことはお勧めしませんが、ここでは機能する可能性があります。

于 2009-06-10T21:24:03.927 に答える