免责声明:我不确定我是否正确提问。
给定具有以下功能的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(...)被调用两次。一旦直接从on page函数和另一次通过Order类事件委托。
附加调试器后,我可以验证RegisterScript(..)是否使用正确的值调用了两次。
但是,即使通过ScriptManager注册了“已发货”警报,弹出的唯一警告仍为“未发货”。
在两种情况下,查看调用堆栈,DDL_OrderStatus_SelectedIndexChanged位于底部,顶部是RegisterScript(..)。
差别似乎在HttpContext或Page中。这就好像被引用的Page实例在两个调用堆栈中都不相同,即使两个调用堆栈都源自DDL_OrderStatus_SelectedIndexChanged。
有谁知道为什么会这样?
答案 0 :(得分:0)
解决:事件处理程序正在!Page.IsPostBack块中注册。这意味着事件处理程序已注册到旧页面,该页面与回发后的页面不同。即使正在调用该函数,它也会在#34; dead"页面的版本,因此不显示警报。我希望这有助于某人。