通过甚至处理程序调用堆栈时页面上下文不一样?

时间:2016-12-21 18:44:01

标签: c# asp.net webforms

免责声明:我不确定我是否正确提问。

给定具有以下功能的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。

有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:0)

解决:事件处理程序正在!Page.IsPostBack块中注册。这意味着事件处理程序已注册到旧页面,该页面与回发后的页面不同。即使正在调用该函数,它也会在#34; dead"页面的版本,因此不显示警报。我希望这有助于某人。