2009-06-30 86 views
6

我有一個很大的問題。我正在ASP.NET 3.5中製作CRM(客戶關係管理)系統我被困在UpdatePanel陷阱

我已經基於DevExpress.com控件和UpdatePanels的使用來完成我的整個項目。

現在我的一個頁面,它是整個系統的中心頁面,包含了很多的可能性,因此有大量的UserControls。

現在我的問題是,它變得非常慢,因爲UpdatePanels重新發布整個頁面而不僅僅是更新面板。我們正在談論的某個時候3-4秒纔出現一個彈出窗口:(

有什麼辦法,我可以重構這個整個系統從UpdatePanel的遠沒有打破我的脖子? 是否有反正我可以優化我使用的UpdatePanel的?

的ViewState的也絕對是巨大的。

任何好的想法,歡迎...

+0

我想我還問,有沒有辦法讓一個UpdatePanel只渲染新的而不是整個頁面。 – 2009-06-30 15:25:21

回答

8

有沒有辦法讓周圍張貼使用UpdatePanel的整個頁面,在這裏代替重新設計應用的是一對夫婦的事情我會嘗試:

  1. 對於不需要任何控件禁用視圖狀態是
  2. 將UpdateMode =「條件」爲您的用戶控件。這樣不會發布整個頁面,但會縮短渲染時間。只有特定UpdatePanel的內容纔會在瀏覽器中更新。
  3. 確保您的用戶控件具有較短的ID。 ASP.NET webforms名稱在html中的控制方式如果您有很多服務器控件,這些ID會重複一遍。命名母版頁佔位符也一樣。我曾經通過重命名用戶控件和佔位符將大頁面縮小至一半大小。
+0

LOL我沒有考慮命名的問題,雖然它是最肯定的存在..是的,他們重複了很多,但我討厭短沒有具體的名字......現在我只需要考慮,如果我討厭慢加載甚至更多.. – 2009-06-30 15:31:12

+0

您可能想澄清一下:「只有特定的用戶控件纔會在屏幕上更新。」它應該可能是「只有特定的UpdatePanel ...」。您也可能想要注意,只有必要的面板纔會發送給客戶端,而不是整個頁面。 – 2009-06-30 16:44:00

+0

用於短ID。這是非常令人沮喪的,而優化我的網頁,以實現一半的元素ID的請求:masterpage_page_form_usercontrol_nestedusercontrol_gridview_label等等等等等 – 2011-12-03 20:08:21

0

你將不得不更換一些包含在你的更新面板與真正的AJAX的回發的來電,即發送所需的行動,以服務器的數據,並取回只有真實需要什麼更新視圖,擺脫回發和UpdatePanels。 (你會注意到我使用'action'和'view'這兩個術語 - 是的,我是一個MVC粉絲。你所處的情境是很容易陷入使用WebForms和ASP的混亂的典型代碼.NET AJAX控件)。

0
  • 我一定會錯過一些東西。爲什麼你的更新面板正在重新加載整個頁面。 updatepanel的要點是隻刷新該面板中的內容,不是嗎?感謝您的解釋。我想我們正在討論重新發布該頁面,而不是像我想的那樣重新繪製面板。

  • 嘗試關閉ViewState,尤其是網格。

  • 什麼樣的控件是最常見的頁面上?嘗試更換那些用自己的輕量用戶控件或服務器控件既然你是一個DevExpress的用戶不使用的ViewState或了ControlState-
2

,你可能會考慮一點時間來學習他們的CallbackPanel這將允許你這樣做異步處理沒有UpdatePanel的開銷。

或者(有人請糾正我,如果我錯了),但如果的回傳的所有是(在一個UpdatePanel IE)是異步的,不會是理論上可以禁用ViewState的整個頁面(在頁面指​​令),而沒有負面影響?你必須完全測試它,但它值得一試。

0

對於所有人感興趣我想添加一個關於如何擺脫客戶端上的Viewstate數據的解決方案。它確實給服務器帶來了額外的負載,但是如果你和我處於同樣的情況,並且有很多服務器的能力,並且需要承擔客戶端的負擔,這很好。

讓所有的網頁從BasePage.cs派生看起來像這樣

public class BasePage : System.Web.UI.Page 
{ 
    protected override void SavePageStateToPersistenceMedium(object viewState) 
    { 
     string vsKey = String.Format("VIEWSTATE_{0}_{1}_{2}", base.Session.SessionID, Request.RawUrl, DateTime.Now); 
     Session.Add(vsKey, viewState); 
     ClientScript.RegisterHiddenField("__VIEWSTATE_KEY", vsKey); 
    } 

    protected override object LoadPageStateFromPersistenceMedium() 
    { 
     string vsKey = Request.Form["__VIEWSTATE_KEY"]; 
     return Session[vsKey]; 
    } 
} 

現在你有一個關鍵視圖狀態數據會話,而不是在你的代碼視圖狀態...

工程就像一個在每天有1000-1200名訪問者的網站上,我也會感受到這種魅力。