28

C#とAjaxを使用してASP.NETアプリケーションを開発しています。

動的にロードされたユーザーコントロールを保持するページがあります。動的にロードされたユーザーコントロールにいくつかのデータ(整数値といくつかの文字列)を渡す必要があります。

現在、Sessionを使用してこれらの値を渡しますが、別の方法を使用できると思います。VIEWSTATEや非表示の入力など。

何をお勧めしますか?

アップデート:

コントロールはすべてのポストバックにロードされ、コントロールに値を格納できないため、コントロールを動的にロードするという事実は重要です。

4

6 に答える 6

47

渡すデータのデータ型を使用してユーザーコントロールにプロパティを作成し、コントロールの作成時にページに入力します。

public class myControl : Control
{
  ...
  public int myIntValue {get; set;}
  ...
}

背後にあるコード:

myControl ctrl = new myControl();
ctrl.myIntValue = 5;

これは、マークアップで直接行うこともできます。

<uc1:myControl ID="uc1" runat="server" myIntValue="5" />
于 2010-02-04T16:30:51.263 に答える
12

ユーザーコントロール内でパブリックプロパティを設定します。

public string TestValue { get;set;};

そして、aspxページにユーザーコントロールを配置すると、次のようになります。

<uc1:UserControl ID="uc1" runat="server" TestValue="Testing" />

コードビハインド内の値を変更することもできます。

uc1.testValue = "some value";
于 2010-02-04T16:31:52.650 に答える
3

実際にあなたの質問に答えるために、他の誰もがあなたにこれをしてほしくないようです、そして私は同意します...私は以前にこの種のことをしました。

私が最初にすることは、あなたのページにインターフェースを実装させることです。

コントロール内:

IVansFannelDataProviderPage provider = this.Page as IVansFannelDataProviderPage; if (provider != null) { //grab data from interface } else throw YouCantPutThisControlOnThisKindOfPageException();

これは最もエレガントな方法ではありませんが、非常に高価なオブジェクトを共有したいコントロールがたくさんある場合、これは法案に適合します。

これはうまく機能しますが、インターフェースを実装していないページではコントロールが使用できなくなり、コントロールがページに緊密に結合されすぎます。ページにコントロールからデータを取得させると言っている他の人は誰でも正しいです。コントロール内のページではなく、ページ上にコントロールを配置します。

あなたはそれをするために非常に正当な理由があるはずです。私たちにとって:共有オブジェクトのロードは非常に高価であり、そのオブジェクトでどのコントロールが機能しているかに関係なく、ページをロード/保存することは非常に便利でした。

コントロールを機能させるためだけに、ある種のサポートまたはプロキシサポートを提供するために、インターフェイスを実際に実装していない多くのページを調整する必要があり、ページとコントロールの再利用性が大幅に低下したのは残念でした。

これをもう一度やり直す必要がある場合は、ページにイベントを含むコントロールにデータを送信させます。怠惰になる必要がある場合は、おそらくリフレクションを使用します。

于 2010-02-04T16:55:43.190 に答える
3

ポストバックごとにこれらのコントロールを再ロードする必要があります...これを読んでください。それは役立つかもしれません。

動的Webコントロール、ポストバック、およびビューステート

于 2010-02-05T04:06:20.747 に答える
0

これはコントロールのカプセル化を壊すので、一種のascxコントロールIMOを使用する目的を無効にします。ページは、コントロールによって公開されたイベントをサブスクライブすることにより、コントロールからデータを取得する必要があります。

于 2010-02-04T16:42:02.173 に答える
0

HttpContext.Itemsコレクションに値を設定し、それらをコントロールで読み取ることができます。これはSessionを使用するのと似ていますが、セッションの存続期間全体ではなく、リクエストごとにのみ使用できる点が異なります。

http://www.4guysfromrolla.com/articles/060904-1.aspx

私見これは少し怠惰ですが、状況によっては良い解決策かもしれません。

于 2010-02-04T17:22:32.017 に答える