1

我有一个网页,允许用户在表单中输入信息。我在页面上以及后面的代码中使用了一些 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);
    }
}
4

2 回答 2

0

我相信有一些非常简单的修复程序可以加快网站的加载速度

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

通常,性能改进可以通过

  1. 改进查询计划
  2. 减少远程调用(IO、DB 等)
  3. 减少加载的数据量。

viewstate 是网络表单的第一大性能杀手。你可以做的任何事情来减小视图状态的大小都是一件好事。

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

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

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

于 2012-01-11T15:37:54.697 回答
0

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

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

有多少表单字段依赖于视图状态中的数据以及下拉列表有多大等。

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

另外,您使用的是什么浏览器,当前的 Chrome 或 Firefox 版本是否更快?

于 2012-01-16T10:51:38.447 回答