5

いくつかの Web パーツがあり、1 つはコントローラーとして、いくつかはコントローラーから情報を取得してそれに基づいて動作するとします。これは、ASP 2.0 で導入された Consumer/Producer インターフェイスを使用してかなり簡単にモデル化できます。

上記を維持しながら、どうすれば逆にインタラクションを追加できるでしょうか?

簡単な例は次のとおりです。ユーザーが検索を実行する Web パーツ A に情報を入力すると、結果が Web パーツ B に表示されます。結果は B になります。

一度にすべての接続で使用できるインターフェイスは 1 つだけであるため、WSS 3.0 では実行できないようです。

これは意味がありますか?:-)

4

2 に答える 2

2

任意のコントロール通信を有効にする手っ取り早いソリューションは、再帰的な検索コントロールとイベントを使用することです。コントロールが必要なものをコントロールの種類別にコントロール ツリーを検索し、パブリッシング コントロールでパブリックに公開されたイベントをサブスクライブします。

私は以前、特定の通信 API を完全に回避するために、さまざまなベンダーの CMS システムに組み込まれている場合に、標準のサーバー コントロールが互いを検出できるようにするためにこのトリックを使用しました。

于 2008-10-01T13:51:02.157 に答える
1

WebパーツAがWebパーツBへの参照を取得し、パブリック/内部メソッド/プロパティを呼び出したり、ハンドラーをパブリック/内部イベントにサブスクライブしたりすることに問題はありません。ただし、これを行う際の注意点の 1 つは、EnsureChildControls です。私は自分の目で、ある Web パーツが PreRender に対してクリアに実行されているのを目撃しましたが、別の Web パーツは CreateChildControls を実行していませんでした。

Web パーツ A から、次のように Web パーツ B への参照をフェッチします (この場合、Web パーツ B は Calendar 型です)。

     private Calendar _calendarWP = null;
    public Calendar CalendarWP
    {
      get
      {
          if (_calendarWP != null)
              return _calendarWP;
          else
              foreach (System.Web.UI.WebControls.WebParts.WebPartZone zone in this.WebPartManager.Zones)
                  foreach (System.Web.UI.WebControls.WebParts.WebPart webpart in zone.WebParts)
                      if (webpart is Calendar)
                      {
                          _calendarWP = (Calendar)webpart;
                          _calendarWP.EnsureChildControls();
                          return _calendarWP;
                      }
          return null;
      }
    }

これで、次のように、新しいデータを取得してカレンダーを更新することができます。

         IEnumerable newData = SomeDataProvider.GetNewData(args);
        CalendarWP.someGridView.DataSource = newData;
        CalendarWP.someGridView.DataBind();

または、Web パーツ A が自身への参照を Web パーツ B に投げて、Web パーツ A のパブリック/内部プロパティを使用して自身のデータを取得できるようにすることもできます。

CalendarWP.UseWPAToFetchData(this);
于 2008-10-01T21:00:27.910 に答える