2012-12-14 117 views
2

我用下面的JavaScript代碼的更新打電話給我更新面板的頁面加載後:如何判斷JavaScript是否導致更新面板更新?

<script type="text/javascript"> 
     function pageLoad(objSender, args) { 
      Sys.WebForms.PageRequestManager.getInstance()._doPostBack('updtPnlAccessoriesPanel', 'updtPnlAccessoriesPanel'); 
     } 
</script> 

我不想更新面板(其中有一個用戶控件)火後,才該頁面已加載並顯示。這將允許它以異步方式更新更新面板(及其用戶控件)。

因此,在用戶控件的page_load中,我想告訴它在初始頁面加載期間忽略任何內容,並且只有在頁面已經爲用戶加載後由javascript調用時纔會執行它的工作。在這個用戶控件中完成的工作需要幾秒鐘的時間,我不希望它減慢初始頁面加載速度。

有什麼想法?

謝謝! :)

回答

0

解決方案很簡單 - 只需使用IsPostBack即可在加載頁面後進行工作,因爲當您使用JavaScript觸發UpdatePanel時,您會發送一條帖子回到服務器。所以這樣做:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack) 
    { 
     // now do your work 
    } 
} 

爲了使它更先進,你甚至可以簡單地檢查回發是否來自該面板。我使用該查收女巫的UpdatePanel是觸發事件的函數,這樣的代碼,我們會像:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack && IsUpdatePanelInRendering(Page, upUpdatePanelId)) 
    { 
     // run the code for update panel 1, me 
     // ... 
    } 
} 

其中IsUpdatePanelInRendering:

public static bool IsUpdatePanelInRendering(Page page, UpdatePanel panel) 
{ 
    Debug.Assert(HttpContext.Current != null, "Where are you called ? HttpContext.Current is null "); 
    Debug.Assert(HttpContext.Current.Request != null, "Where are you called HttpContext.Current.Request is null "); 

    // if not post back, let it render 
    if (false == page.IsPostBack) 
    { 
     return true; 
    } 
    else 
    { 
     try 
     { 
      // or else check if need to be update 
      ScriptManager sm = ScriptManager.GetCurrent(page); 

      if (sm != null && sm.IsInAsyncPostBack) 
      { 
       Debug.Assert(HttpContext.Current.Request.Form != null, "Why forms are null ?"); 

       string smFormValue = HttpContext.Current.Request.Form[sm.UniqueID]; 

       if (!string.IsNullOrEmpty(smFormValue)) 
       { 
        string[] uIDs = smFormValue.Split("|".ToCharArray()); 
        if (uIDs.Length == 2) 
        { 
         if (!uIDs[0].Equals(panel.UniqueID, StringComparison.InvariantCultureIgnoreCase)) 
         { 
          return false; 
         } 
        } 
       } 
      } 
     } 
     catch (Exception x) 
     { 
      Debug.Fail("Ops, what we lost here ?"); 
     } 

     return true; 
    } 
} 
+0

謝謝!我現在就試試這個...... – CodingIsSwell

+0

我仍然無法讓它表現正確,Aristos。 我希望整個頁面被渲染和可見,包括一些用戶控件等。然後,我想要一個特定的更新面板(其中只有一個用戶控件)加載並完成其所有工作之後的其他部分該頁面在那裏。 此外,在我的情況下,主頁面做了一些工作,並將一些數據保存在會話變量中。然後,我希望延遲更新面板/用戶控件使用它來做更多的工作。 – CodingIsSwell

+0

如何告訴我的用戶控件在第一次加載頁面時不會觸發,而只是稍後通過javascript updatepanel調用異步執行其工作? – CodingIsSwell