免責事項:わからない質問を正しく聞いています。ページ・コンテキストがハンドラ・コール・スタックを通過するときに同じではありませんか?
次のような機能をASP.NETページを考える:
protected void Order_Shipped()
{
RegisterScript("Shipped");
}
protected void DDL_OrderStatus_SelectedIndexChanged(object sender, EventArgs e)
{
RegisterScript("Not Shipped");
Order.Status = DDL_OrderStatus.SelectedValue;
}
protected void RegisterScript(string value)
{
ScriptManager.RegisterStartupScript(Page, typeof(Page), "Blarg" + value, "alert('" + value + "');", true);
}
Order.Statusアクセサはページ上Order_Shipped()を呼び出し、それに接続されているイベントハンドラを持っています。
基本的に、注文は出荷時にマークされると、ページ上の機能に戻ります。
注文クラスには、次のものがあります。
private string _Status;
public string Status
{
get { return _Status; }
set
{
_Status = value != null ? value.Trim() : value;
if(value != null && value.Contains("Shipped"))
{
On_Shipped();
}
}
}
......
public delegate void Del_Shipped();
private event Del_Shipped _Shipped;
public event Del_Shipped Shipped
{
add
{
if(_Shipped == null || !_Shipped.GetInvocationList().Contains(value))
{
_Shipped += value;
}
}
remove
{
_Shipped -= value;
}
}
protected virtual void On_Shipped()
{
if(_Shipped != null)
{
_Shipped.Invoke();
}
}
イベントハンドラは、ページのロード上のオブジェクトに取り付けられています。
イベントハンドラ関数RegisterScript(...)が2回呼び出されています。ページ上の関数から直接一度、Orderクラスのイベントデリゲートを介してもう一度。
デバッガを接続すると、RegisterScript(..)が正しい値で2回呼び出されることが確認できます。
ただし、「発送済み」の警告がScriptManagerを介して登録されているにもかかわらず、ポップアップする唯一の警告は「出荷されません」です。
コールスタックを見ると、DDL_OrderStatus_SelectedIndexChangedは、どちらの場合も最上部にRegisterScript(..)が付いています。
違いは、HttpContextまたはPageにあるようです。両方の呼び出しスタックがDDL_OrderStatus_SelectedIndexChangedに由来していても、参照されているPageインスタンスが両方の呼び出しスタックで同じでないかのようです。
これがなぜこのように考えられるのですか?