如何加速使用jQuery的asp.net页面

时间:2012-01-11 15:23:23

标签: jquery performance webforms pagespeed

我有一个允许用户在表单中输入信息的网页。我在页面上以及后面的代码中使用了一些jQuery,我需要找到一种加速页面的方法(大约需要30秒才能加载)。我相信有一些非常简单的修复方法可以加快网站的加载速度,下面是网站的一些信息。任何帮助都可以加快网站的加载速度。

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" Runat="Server">

  <script type="text/javascript">
      $(document).ready(function () {
          var i = $("table.newRequirementClass tr td:contains('Description')").next();

          i.textLimiter({
              maxLength: 255,
              elCount: 'elCount'
          });
          $("#submitMIFields").hide();
          $("#submitMIFields").toggle(false);
          $("[id$='chkMI']").change(function () {
              $("#submitMIFields").toggle("slow");
          });

          $(".MIHead").hide();
      });

      function Count(text, maxLength) {
          if (text.value.length > maxLength) {
              text.value = text.value.substring(0, maxLength);
          }
      }
   </script>

<div style="text-align: left; width: 80%;">
        <h2 runat="server" id="h2Caption">New Requirement</h2>
        <asp:Panel ID="ErrorSummary" runat="server">
        <asp:Label runat="server" ID="lblErrors" />
        <asp:ValidationSummary id="valSummary" runat="server"
        HeaderText="Please Revise The Following Errors:"
        ShowSummary="true" DisplayMode="List" />

        </asp:Panel>
        <asp:DetailsView ID="dvNewRequirement" 
            runat="server"  CssClass="newRequirementClass"
            AutoGenerateRows="False" 
            Width="100%"
            DefaultMode="Insert"
            SkinID="SampleDetailsView" 
            CssSelectorClass="PrettyDetailsView" 
            OnItemInserting="dvNewRequirement_ItemInserting" 
            OnModeChanging="dvNewRequirement_ModeChanging" 
            ondatabound="dvNewRequirement_DataBound" >
            <FieldHeaderStyle Width="15em" Font-Bold="True"/>
            <Fields>
                <asp:TemplateField HeaderText="Status">
                    <InsertItemTemplate>
                    <asp:Label ID="lblStatus" Text="Pre-Solicitation" runat="server" />

                    </InsertItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Vehicle:" Visible="false" >
                    <InsertItemTemplate>
                        <asp:DropDownList ID="ddlVehicles"
                            runat="server" 
                            DataTextField="strDescription" 
                            DataValueField="strCode" 
                            DataSource='<%# CodeLists.Vehicles() %>'
                            AppendDataBoundItems="true">
                            <asp:ListItem Text="" Value="" />
                        </asp:DropDownList>
                    </InsertItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Office:">
                    <InsertItemTemplate>
                        <Proj:OrgTree id="OrgTree" runat="server" Filter="false" Visible='<%# (AuthenticatedUser.CanCreateMis() != true) ? true : false %>'
                        SelectedValue = '<%# (AuthenticatedUser.IsCUS() != true) ? BaseControl.LoginOffice : Guid.Empty %>' />
                    </InsertItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Customer Office:">
                    <InsertItemTemplate>
                        <Proj:OrgTree id="customerOrgTree" Filter="false" runat="server"
                        SelectedValue = '<%# (AuthenticatedUser.CanCreateMis() == true) ? BaseControl.LoginOffice : Guid.Empty %>' />
                    </InsertItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Description:" ControlStyle-CssClass="Description">
                    <InsertItemTemplate>
                        <asp:TextBox runat="server" ID="txtDescription"
                            TextMode="multiLine" onKeyUp="Count(this,257)" onChnage="Count(this,257)"
                            Width="90%"/><br />
                            <div id="elCount"></div>
                    </InsertItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Procurement Type:">
                    <EditItemTemplate>
                        <asp:DropDownList ID="ddlProcurementTypeList" 
                            runat="server" 
                            DataTextField="strDescription" 
                            DataValueField="strCode" 
                            DataSource='<%# CodeLists.ProcurementTypes() %>'
                            AppendDataBoundItems="true">
                        </asp:DropDownList>
                    </EditItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Type:">
                    <InsertItemTemplate>
                        <asp:DropDownList ID="ddlTypeList" 
                            runat="server" 
                            DataTextField="strDescription" 
                            DataValueField="strCode" 
                            DataSource='<%# CodeLists.Types() %>'
                            AppendDataBoundItems="true">
                            <asp:ListItem Text="" Value="" />
                        </asp:DropDownList>

                    </InsertItemTemplate>
                </asp:TemplateField>
            <asp:TemplateField HeaderText="Est Total Value:">
                <InsertItemTemplate>
                    <asp:TextBox ID="txtEstValue" 
                        runat="server"  />
                    <ajax:FilteredTextBoxExtender ID="FilteredTextBoxExtender1"
                        TargetControlID="txtEstValue"
                        FilterType="Numbers,Custom"
                        ValidChars=",."
                        runat="server" />                                                    
                </InsertItemTemplate>
            </asp:TemplateField> 
            <asp:TemplateField HeaderText="Customer Contact Date:">
                <EditItemTemplate>
                    <asp:TextBox ID="txtCustomerContact" 
                        runat="server"  />
                    <ajax:CalendarExtender ID="calCustomerContact" 
                        runat="server" 
                        TargetControlID="txtCustomerContact" />
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Req Start Date:">
                <EditItemTemplate>
                    <asp:TextBox ID="txtReqStartDate" 
                        runat="server" />
                    <ajax:CalendarExtender ID="calReqStartDate" 
                        runat="server" 
                        TargetControlID="txtReqStartDate" />
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Previous Number:">
                <EditItemTemplate>
                    <asp:DropDownList ID="ddlAwardList" 
                        runat="server" 
                        DataTextField="strAwardNumber" 
                        DataValueField="strAwardNumber" 
                        DataSource='<%# CodeLists.AwardNumbers() %>'
                        AppendDataBoundItems="true">
                        <asp:ListItem Text="None" Value="" />
                    </asp:DropDownList>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Currency">
                <EditItemTemplate>
                    <asp:DropDownList ID="ddlCurrencyList"
                        runat="server"
                        DataTextField="strCultureName"
                        DataValueField="strCulture"
                        DataSource='<%# CodeLists.Currency() %>'
                        AppendDataBoundItems="true" >
                        </asp:DropDownList>
                </EditItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="?">
                <EditItemTemplate>
                    <asp:CheckBox runat="server" ID="chkMI" />
                    <div id="submitMIFields">
                        <Proj:MI runat="server" ID="initialMI" />
                    </div>
                </EditItemTemplate>
            </asp:TemplateField>
                <asp:CommandField InsertText="Submit" ShowCancelButton="False" 
                    ShowInsertButton="True" ControlStyle-CssClass="NewReqSubButton" />
            </Fields>
        </asp:DetailsView>

    </div>


    protected void Page_Load(object sender, EventArgs e)
{
    if (AuthenticatedUser.CanCreateMis())
    {
        CheckBox chkMI = (CheckBox)dvNewRequirement.FindControl("chkMI");
        chkMI.Checked = true;
        chkMI.Enabled = false;
        runjQueryCode();

    }
}

    private string getJQueryCode()
{
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("$(document).ready(function() {");
    sb.AppendLine("$('#submitMIFields').show();");
    sb.AppendLine(" });");

    return sb.ToString();

}

private void runjQueryCode()
{
    ScriptManager requestSM = ScriptManager.GetCurrent(Page);
    if (requestSM != null && requestSM.IsInAsyncPostBack)
    {
        ScriptManager.RegisterClientScriptBlock(this,
                                                typeof(Page),
                                                Guid.NewGuid().ToString(),
                                                getJQueryCode(),
                                                true);
    }
    else
    {
        Page.ClientScript.RegisterClientScriptBlock(typeof(Page),
                                                Guid.NewGuid().ToString(),
                                                getJQueryCode(),
                                                true);
    }
}

2 个答案:

答案 0 :(得分:0)

  

我确信有一些非常简单的修复方法可以加快网站的加载速度

这真的取决于,因为这是使用webforms性能改进通常需要很多工作。 Webforms是最难调试和扩展的Web框架之一。

通常可以通过

进行性能改进
  1. 改进查询计划
  2. 减少远程调用(IO,DB等)
  3. 减少加载的数据量。
  4. viewstate是使用webforms的第一个性能杀手。你可以采取的任何措施来减少视图状态的大小是一件好事。

    如果您一次只显示几条记录,则只加载要显示的记录。页面通过数据库中的数据,而不是UI。当您从数据库加载100或1000条记录然后显示1-20条记录时,所有检索到的记录都存储在视图状态中,而不仅仅是显示给用户的记录。

    执行的查询数量也会降低性能。假设您有一个gridview,当您绑定到gridview时,您可以使用数据源控件将查找值列表加载到下拉列表中。每次下拉列表绑定时,数据源都将执行。创建像这样的选择n + 1 问题非常容易。

    最后,如果查询格式不正确,或者数据库架构未经过优化(索引等),查询可能需要几秒甚至几分钟而不是毫秒才能执行。

答案 1 :(得分:0)

挖掘出Dynatrace AJAX版本(http://ajax.dynatrace.com/ajax/en/)

视图状态有多大,它的反序列化需要多长时间?

有多少表单字段依赖于viewstate中的数据以及下拉列表的大小等。

我的猜测是你推送了太多的数据,然后必须通过Javascript反序列化并填充到表单中。

您使用的是哪种浏览器,使用当前的Chrome或Firefox版本是否更快?