C#とAjaxを使用してASP.NETアプリケーションを開発しています。
動的に読み込まれるユーザーコントロールを保持するページがあります。一部のデータ(整数値と一部の文字列)を、読み込まれたユーザーコントロールに渡す必要があります動的に。
今はSessionを使用してこれらの値を渡しますが、別の方法を使用できると思います。 VIEWSTATEや隠し入力のようなもの。
何を勧めますか?
更新:
コントロールはすべてのポストバックに読み込まれ、コントロールに値を格納できないため、コントロールを動的に読み込むという事実は重要です。
渡すデータのデータ型を使用して、ユーザーコントロールにプロパティを作成し、コントロールの作成時にページに入力します。
public class myControl : Control
{
...
public int myIntValue {get; set;}
...
}
背後のコードでは:
myControl ctrl = new myControl();
ctrl.myIntValue = 5;
これをマークアップで直接行うこともできます。
<uc1:myControl ID="uc1" runat="server" myIntValue="5" />
ユーザーコントロール内でパブリックプロパティを設定します。
public string TestValue { get;set;};
次に、aspxページにユーザーコントロールを配置すると、次のようになります。
<uc1:UserControl ID="uc1" runat="server" TestValue="Testing" />
コードビハインド内の値を変更することもできます。
uc1.testValue = "some value";
各ポストバックでこれらのコントロールを再ロードする必要があります...これを読んでください。役立つかもしれません。
実際にあなたの質問に答えるには、他の誰もがあなたがこれをすることを望んでいないように思われます、そして私は同意します...私は以前にこの種のことをしました。
最初に、ページにインターフェースを実装させます。
コントロールでは:
IVansFannelDataProviderPage provider = this.Page as IVansFannelDataProviderPage; if (provider != null) { //grab data from interface } else throw YouCantPutThisControlOnThisKindOfPageException();
これは最もエレガントな方法ではありませんが、非常に高価なオブジェクトを共有したい多くのコントロールがあった場合、これで十分です。
これは適切に機能しますが、インターフェイスを実装していないページではコントロールが使用できなくなります。これにより、コントロールがページに密結合しすぎます。ページからコントロールからデータを取得するように言っている人は誰でも、正解です。コントロール内のページではなく、ページにコントロールを配置します。
それを行うには、十分な理由があるはずです。私たちにとって:共有オブジェクトのロードは非常に負荷が高く、そのオブジェクトに対してどのコントロールが機能していても、ページをロード/保存することは非常に便利でした。
コントロールを機能させるためだけに何らかのサポートやプロキシサポートを提供するために、インターフェイスを実際に実装していない多くのページに手を加える必要があり、ページやコントロールの再利用性が大幅に低下したのは、残念でした。
これをもう一度行う必要がある場合は、ページをイベント付きのコントロールにデータを送信する必要があります。遅延する必要がある場合は、おそらくリフレクションを使用します。
これは、コントロールのカプセル化を壊すため、ASCXコントロールIMOを使用する目的に反します。ページは、コントロールから発行されたイベントにサブスクライブして、コントロールからデータを取得している必要があります。
あなたはcouldHttpContext.Itemsコレクションに値を設定し、それらをコントロールで読み取ります。これは、セッションの存続期間全体ではなく、リクエストごとにのみ使用できることを除いて、Sessionの使用に似ています。
http://www.4guysfromrolla.com/articles/060904-1.aspx
私見これは少し面倒ですが、状況によっては良い解決策になるかもしれません。