我正在开发一个ASP.Net应用程序,并努力为它添加一些Ajax来加速某些领域。我所关注的第一个领域是教师报告孩子出勤率(以及其他一些数据)的出勤区域。这需要很快。
我创建了一个双控制设置,用户点击图标,然后通过Javascript和Jquery弹出第二个控件。然后我使用__doPostBack()来刷新弹出控件以加载所有相关数据。
这是一个小视频片段,展示它是如何工作的:http://www.screencast.com/users/cyberjared/folders/Jing/media/32ef7c22-fe82-4b60-a74a-9a37ab625f1f(:21并忽略音频背景)。
在Firefox和Chrome中,每次“弹出”的速度都比我想要的慢2-3秒,但它在IE中完全不可行,每次弹出并加载时都很容易用7-8秒。并且忽略了在数据被更改后保存数据所需的任何时间。
这是处理弹出窗口的javascript:
function showAttendMenu(callingControl, guid) {
var myPnl = $get('" + this.MyPnl.ClientID + @"')
if(myPnl) {
var displayIDFld = $get('" + this.AttendanceFld.ClientID + @"');
var myStyle = myPnl.style;
if(myStyle.display == 'block' && (guid== '' || guid == displayIDFld.value)) {
myStyle.display = 'none';
} else {
// Get a reference to the PageRequestManager.
var prm = Sys.WebForms.PageRequestManager.getInstance();
// Unblock the form when a partial postback ends.
prm.add_endRequest(function() {
$('#" + this.MyPnl.ClientID + @"').unblock({ fadeOut: 0});
});
var domEl = Sys.UI.DomElement;
//Move it into position
var loc = domEl.getLocation(callingControl);
var width = domEl.getBounds(callingControl).width;
domEl.setLocation(myPnl, loc.x + width, loc.y - 200);
//Show it and block it until we finish loading the data
myStyle.display = 'block';
$('#" + this.MyPnl.ClientID + @"').block({ message: null, overlayCSS: { backgroundColor:'#fff', opacity: '0.7'} });
//Load the data
if(guid != '') { displayIDFld.value = guid; }
__doPostBack('" + UpdatePanel1.ClientID + @"','');
}
}}
首先,我不明白为什么__doPostBack()在IE中引入了这样的延迟。如果我把它和prm.add_endRequest拿出来,那就非常快,因为没有发生回发。
其次,我需要一种方法来弹出此控件并刷新数据,使其仍然是交互式的。我没有与UpdatePanel结婚,但我无法弄清楚如何使用Web服务/静态页面方法。正如您所看到的,此控件在同一页面上多次加载,因此页面大小和下载速度是一个问题。
我很欣赏任何想法?
编辑:在IE 6或7中也是如此。我认为它与IE处理UpdatePanel有关,因为在FF和Chrome中相同的代码要快得多。
答案 0 :(得分:7)
如果速度/性能是您的一个主要问题,我强烈建议不要使用UpdatePanels,因为它们会导致整页回发在标题中拖动ViewState,以及其他垃圾,并强制页面经历整个生命每次循环(即使用户没有看到这个)。
你应该能够(相对容易地)使用PageMethods来完成你的任务。
// In your aspx.cs define the server-side method marked with the
// WebMethod attribute and it must be public static.
[WebMethod]
public static string HelloWorld(string name)
{
return "Hello World - by " + name;
}
// Call the method via javascript
PageMethods.HelloWorld("Jimmy", callbackMethod, failMethod);
答案 1 :(得分:4)
仅限IE的已知问题,请参阅KB 2000262。可以找到解决方法/修复here。我和他们一起使用脚本,很遗憾他们无法解决问题。
答案 2 :(得分:1)
在之前的项目中注意到,当我们在页面上有大量文本框时,IE变得非常慢,在用fiddler检查之后我们发现渲染引擎很慢。
(顺便说一下,在你们大声喊叫之前,150多个文本框是明确的客户要求,我们基本上在网上重新创建了自定义的Excel)
答案 3 :(得分:0)
要了解为什么花了这么长时间我会建议使用Fiddler监视您的IE流量:http://www.fiddlertool.com/fiddler/
您将查看每条消息的响应,以了解它们的大小。如果消息大于5kb,那么UpdatePanel就太小了。
这听起来像是你想要做的一件相当简单的事情,所以我很难相信更新面板应该受到责备。测试它应该不会太困难。在没有UpdatePanel的情况下测试此方法的最简单方法是使用PageMethod。这个页面有一个很棒的教程: http://weblogs.asp.net/sohailsayed/archive/2008/02/23/calling-methods-in-a-codebehind-function-pagemethods-from-client-side-using-ajax-net.aspx
您是否也可以发布您的UpdatePanel代码以便我们获取更多详细信息?
编辑:谢谢!您使用的是哪个版本的IE?
答案 4 :(得分:0)
这是弹出控件的代码(页面上只有一个由包含图标的所有控件共享):
<script type="text/javascript" src="<%=Response.ApplyAppPathModifier("~/js/jquery-1.2.6.js") %>"></script>
<script type="text/javascript" src="<%=Response.ApplyAppPathModifier("~/js/jquery.blockUI.js") %>"></script>
<asp:Panel CssClass="PopOutBox noPrint" ID="MyPnl" style="display: none; z-index:1000; width:230px; position: absolute;" runat="server">
<cmp:Image MyImageType="SmallCancel" CssClass="fright" runat="server" ID="CloseImg" AlternateText="Close" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:HiddenField ID="AttendanceFld" runat="server" />
<asp:HiddenField ID="DatePickerFld" runat="server" />
<table width="100%">
<tr>
<td valign="top">
<asp:RadioButtonList EnableViewState="false" ID="AttendRBL" runat="server" RepeatDirection="Vertical">
<asp:ListItem Selected="True" Text="On Time" Value="" />
<asp:ListItem Text="Late" Value="Late" />
<asp:ListItem Text="Absent" Value="Absent" />
<asp:ListItem Text="Cleaning Flunk" Value="Other" title="This is used for things like cubby flunks" />
<asp:ListItem Text="Major Cleaning Flunk" Value="Major" title="This is used for things like White Glove flunks" />
</asp:RadioButtonList>
</td>
<td valign="top" style="text-align: center; vertical-align: middle;">
<asp:CheckBox EnableViewState="false" ID="ExcusedCB" runat="server" />
<br />
<asp:Label ID="Label1" EnableViewState="false" AssociatedControlID="ExcusedCB" Text="Excused"
runat="server" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:Label EnableViewState="false" ID="Label2" Text="Notes" runat="server" AssociatedControlID="DataTB" />
<cmp:HelpPopUp EnableViewState="false" runat="server" Text='Must include "Out Sick" to be counted as ill on reports and progress reports' />
<br />
<asp:TextBox ID="DataTB" EnableViewState="false" runat="server" Columns="30" /><br />
<div style="font-size: 10px; text-align:center;">
<a href="#" onclick="setAttendVal('<%=this.DataTB.ClientID%>','Out Sick');return false;">
(Ill)</a> <a href="#" onclick="setAttendVal('<%=this.DataTB.ClientID%>','In Ethics');return false;">
(Ethics)</a> <a href="#" onclick="setAttendVal('<%=this.DataTB.ClientID %>','Warned');return false;">
(Warned)</a>
</div>
</td>
</tr>
<tr>
<td colspan="2">
<cmp:ImageButton ID="DeleteBtn" OnClientClick="showAttendMenu(this,'');" OnClick="DeleteAttendance" ButtonType="SmallDelete"
CssClass="fright" runat="server" />
<cmp:ImageButton ID="SaveBtn" OnClientClick="showAttendMenu(this,'');" OnClick="SaveAttendance" ButtonType="SmallSave" runat="server" />
</td>
</tr>
</table>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Panel>
答案 5 :(得分:0)
使用DOM和HTTP请求本质上很慢,它是浏览器。加快速度的最佳方法是减少HTTP请求(AJAX或其他)的次数,减少DOM操作的数量,搜索,编辑,替换等。
答案 6 :(得分:0)
我建议使用link text进行效果跟踪。它是Internet Explorer中AJAX性能分析的免费工具