我有一个很大的问题。我正在使用ASP.NET 3.5中的CRM(客户关系管理)系统
我的整个项目基于DevExpress.com控件和UpdatePanels的使用。
现在我的一个页面,即整个系统的中心页面,包含了大量的可能性,因此有大量的UserControls。
现在我的问题是它变得非常慢,因为UpdatePanels正在重新发布整个页面而不仅仅是更新面板。我们正在谈论弹出窗口出现之前3-4秒:(
有没有办法可以在不破坏我脖子的情况下将整个系统从UpdatePanels重构出来? 无论如何我可以优化我对UpdatePanels的使用吗?
ViewState也绝对是巨人。
欢迎任何好的想法......
答案 0 :(得分:8)
使用UpdatePanels无法绕过整个页面。代替重新设计应用程序,我尝试了几件事:
答案 1 :(得分:2)
由于您是DevExpress用户,您可能需要花一点时间来学习他们的CallbackPanel,这样您就可以在没有UpdatePanel开销的情况下进行异步处理。
或者(有人请纠正我,如果我错了)但如果所有的回发都是异步的(即在UpdatePanel中),理论上不可能在整个过程中禁用ViewState页面(在Page指令中)没有负面后果?你必须完全偏离测试,但它值得一试。
答案 2 :(得分:0)
您必须使用真实的AJAX调用替换更新面板中包含的一些回发,即将仅操作所需的数据发送到服务器并返回只有更新视图,摆脱回发和UpdatePanels所需的内容。
(你会注意到我对'action'和'view'一词的使用 - 是的,我是MVC的粉丝。你所处的情况是使用WebForms和ASP很容易搞得的混乱局面。 NET AJAX控件。)
答案 3 :(得分:0)
我必须遗漏一些东西。为什么您的updatepanel正在重新加载整个页面。 updatepanel的目的是仅刷新该面板中的内容,不是吗?感谢您的解释。我想我们正在谈论重新发布页面,而不是像我想的那样重新绘制面板。
尝试关闭ViewState,尤其是网格。
答案 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的网站上,对我来说就像一个魅力。