次のシナリオを想像してみてください。コントロール A とコントロール B を含む Page1 があります。
コントロール A にボタンがあり、このボタンをクリックすると、コントロール B が反応するとします。しかし、これを抽象的な方法で行いたいと考えています。つまり、コントロール A について何も知らないコントロール B を持つことはできず、その逆も同様です。
そうすれば、これらのコントロールを分離して開発し、単体テストによってそれらを駆動できます。
今、私は解決策を持っていると思いました。皆さんがそれについてどう思うか知りたいだけです.
コントロール A のボタン クリックで、セッションに「メッセージ」を配置します。つまり、Session["MESSAGES"] = "ControlA_Click" です。
Page1 の Page_LoadComplete() で、次のように ProcessMessages を呼び出します。
List<Message> messages = SessionMessages.GetMessageList(Page);
foreach(Message m in messages)
{
//Get Controls
ControlA controlA = FindControl("controlA") as ControlA;
controlA .ProcessMessage(m);
ControlB controlB = FindControl("controlB") as ControlB;
controlB.ProcessMessage(m);
}
ControlB の ProcessMessage() メソッドでは、次のように、ControlB が関心のあるメッセージに反応できます。
if (m.MessageName == SessionMessages.C_MESSAGE_SEARCH)
{
this.Visible = true;
}
私には、これはうまくいくようです。これにより、これらのコントロールを互いに完全に個別に開発できますが、抽象レベルでのコントロール間の通信も可能です。
このクラッシュを引き起こす可能性があると私が考えることができる唯一のことは、おそらくページとユーザー コントロールに関連する ASP.NET ライフサイクルです。私がそれを理解する方法は、所有するページで Page_LoadComplete() が呼び出される前に、すべてのイベントがコントロールで処理されている必要があるということです。
考え?