【问题标题】:ASP.NET Validator Controls Slowing Down PageASP.NET 验证器控制页面变慢
【发布时间】:2011-01-26 14:01:22
【问题描述】:

我有一个 UpdatePanel,其中动态添加了用户控件。有时可能有几十个用户控件。

随着更多用户控件的添加,页面/UpdatePanel 会大大减慢每次回发的时间。经过一番挖掘,我惊讶地发现原因是每个用户控件上存在的各种 CompareValidator、CustomValidator、RegularExpressionValidator 和 RequiredFieldValidator 控件。

有人有建议吗?让我感到非常奇怪的是,包含这些 ASP.NET 控件会对性能产生如此可怕的影响。

谢谢,

卡尔文

【问题讨论】:

  • 慢是客户端还是服务器端?

标签: asp.net controls validation


【解决方案1】:

大多数(全部?) ASP.NET 验证控件自 .NET 框架的第一个版本以来就已经存在,它们符合那个时代的一般 Web 控件氛围:“在我的 T1 线上工作得很好。 '

对于性能敏感的应用程序,我不会使用这些。有一些变通方法,但治愈可能比疾病更糟糕。 (例如,您可以通过设置EnableClientScript = false 在服务器上进行所有验证。)

现在,我一般使用jQuery Validation plugin

【讨论】:

  • 谢谢,杰夫。因为用户控件是动态添加的,所以没有缓存选项可以提供帮助,对吗?
  • 根据您的设置,您的浏览器应该能够缓存 一些 javascript(详情请参阅msdn.microsoft.com/en-us/library/…),但有些 javascript 是直接写入输出(如您所见 - 数组声明、错误消息初始化等)。我不认为它们是被动态添加的,但我不确定 - 也有可能是干扰。
【解决方案2】:

有几件事。首先,所有 ASP.NET Validation 控件都会生成大量 JavaScript,这些 JavaScript 作为 WebResource 或 ScriptResource 添加到页面中。这些脚本被下载一次然后被缓存,因此它们不应该导致频繁导致缓慢的问题。

另一件事是更新面板。更新面板是一个很棒的控件,但它确实在 ViewState 上进行中继。这意味着您在更新面板中放置的任何控件,该控件的视图状态都将在回发时发送到服务器。随着 UpdatePanel 内的控件增加,ViewState 也会增加。

一种解决方案可能是在不需要的控件上关闭 ViewState。您还可以强制 ViewState 在页面底部移动。这将确保最终下载 ViewState。

这是我的帖子,描述了如何创建 ViewState 移动控件:

http://azamsharp.com/Posts/139_ViewStateMoverModule_Released_.aspx

【讨论】:

  • 我可以确认大量的 JavaScript 是直接生成的: 包含页面验证器的数组;将属性(例如,“errormessage”、“validationGroup”等)分配给验证器; “处置”逻辑的创建和分配。对于几十个用户控件,生成的验证器代码大约有 1600 行,超过总页面大小的一半。除了客户端处理它所花费的时间之外,此代码的数量也是问题所在。由于这段代码是由 ASP.NET 自动生成的,我猜我无能为力。任何人都可以确认或否认这一点吗?
  • 另外,Azam,请问您是如何知道验证器 Javascript 在第一次下载后被缓存并重用的?据我所见,使用 Fiddler 并通过查看运行中的代码的经验,回发到 UpdatePanel 总是会导致相同数量的 HTML 正文数据通过网络传输。这反过来会导致回发的持续缓慢。对此我能做些什么吗?
【解决方案3】:

如果您有很多这样的验证器,并且启用了客户端验证,浏览器可能很难通过所有这些验证器。

【讨论】:

  • 谢谢,戴夫。你可能正在做某事。请在下面查看我对 Azam 的 cmets。
  • 如果您想要一个好的测试,请在 Firefox、IE 和 Chrome 之间进行比较。根据个人经验,我的理论是,由于采用了 V8 javascript 引擎,Chrome 浏览它们的速度将比 IE 或 Firefox 快 10 倍。
猜你喜欢
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 2010-09-20
  • 2022-12-28
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
相关资源
最近更新 更多