我被困在UpdatePanel陷阱中

时间:2009-06-30 15:07:42

标签: asp.net updatepanel

我有一个很大的问题。我正在使用ASP.NET 3.5中的CRM(客户关系管理)系统

我的整个项目基于DevExpress.com控件和UpdatePanels的使用。

现在我的一个页面,即整个系统的中心页面,包含了大量的可能性,因此有大量的UserControls。

现在我的问题是它变得非常慢,因为UpdatePanels正在重新发布整个页面而不仅仅是更新面板。我们正在谈论弹出窗口出现之前3-4秒:(

有没有办法可以在不破坏我脖子的情况下将整个系统从UpdatePanels重构出来? 无论如何我可以优化我对UpdatePanels的使用吗?

ViewState也绝对是巨人。

欢迎任何好的想法......

5 个答案:

答案 0 :(得分:8)

使用UpdatePanels无法绕过整个页面。代替重新设计应用程序,我尝试了几件事:

  1. 禁用任何不需要它的控件的viewstate
  2. 为您的用户控件设置UpdateMode =“Conditional”。这不会绕过整个页面,但它会减少渲染时间。只有特定UpdatePanel的内容才会在浏览器中更新。
  3. 确保您的用户控件具有短ID。如果你有很多服务器控件,那么ASP.NET webforms在html中控制名称控件的方式会重复这些ID。命名母版页占位符也是如此。我曾经通过重命名用户控件和占位符将大页面缩小到一半。

答案 1 :(得分:2)

由于您是DevExpress用户,您可能需要花一点时间来学习他们的CallbackPanel,这样您就可以在没有UpdatePanel开销的情况下进行异步处理。

或者(有人请纠正我,如果我错了)但如果所有的回发都是异步的(即在UpdatePanel中),理论上不可能在整个过程中禁用ViewState页面(在Page指令中)没有负面后果?你必须完全偏离测试,但它值得一试。

答案 2 :(得分:0)

您必须使用真实的AJAX调用替换更新面板中包含的一些回发,即将操作所需的数据发送到服务器并返回只有更新视图,摆脱回发和UpdatePanels所需的内容。

(你会注意到我对'action'和'view'一词的使用 - 是的,我是MVC的粉丝。你所处的情况是使用WebForms和ASP很容易搞得的混乱局面。 NET AJAX控件。)

答案 3 :(得分:0)

  • 我必须遗漏一些东西。为什么您的updatepanel正在重新加载整个页面。 updatepanel的目的是仅刷新该面板中的内容,不是吗?感谢您的解释。我想我们正在谈论重新发布页面,而不是像我想的那样重新绘制面板。

  • 尝试关闭ViewState,尤其是网格。

  • 您网页上最常见的控件是什么?尝试使用您自己的轻量级UserControl或不使用ViewState或ControlState
  • 的服务器控件替换它们

答案 4 :(得分: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的网站上,对我来说就像一个魅力。