5

私はASP.Netアプリケーションに取り組んでおり、特定の領域を高速化するためにAjaxを追加しようとしています。私が集中している最初の領域は、教師が子供たちの出席 (およびその他のデータ) を報告するための出席領域です。これは高速である必要があります。

ユーザーがアイコンをクリックし、Javascript と Jquery を介して 2 番目のコントロールをポップアップするデュアル コントロール セットアップを作成しました。次に、__doPostBack() を使用してポップアップ コントロールを更新し、関連するすべてのデータを読み込みます。

これがどのように機能するかを示す小さなビデオ スニペットを次に示します

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 + @"','');
    }
}}

まず、IE で __doPostBack() によってこのような遅延が発生する理由がわかりません。それと prm.add_endRequest を取り出すと、ポストバックが発生しないため、非常に高速です。

次に、このコントロールをポップアップしてデータを更新し、対話型のままにする方法が必要です。私は UpdatePanel と結婚していませんが、Web サービス/静的ページ メソッドでそれを行う方法を理解できていません。ご覧のとおり、このコントロールは同じページに何度も読み込まれるため、ページ サイズとダウンロード速度が問題になります。

アイデアをいただければ幸いです。

編集:IE 6または7でも同じです。FFとChromeでは同じコードがはるかに高速であるため、IEのUpdatePanelの処理に関係していると思います。

4

7 に答える 7

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);
于 2008-11-11T17:48:53.620 に答える
4

これは IE のみの既知の問題です。KB 2000262を参照してください。回避策/修正については、こちらを参照してください。私はスクリプトで彼らと協力しましたが、彼らが本当の修正を出すことができないのは残念です.

于 2010-08-01T16:11:41.590 に答える
1

以前のプロジェクトで、ページにヒープ(150以上)のテキストボックスがあるとIEがひどく遅くなることに気づきました。フィドラーに確認したところ、遅いのはレンダリングエンジンであることがわかりました。

(ところで、皆さんが叫ぶ前に、150以上のテキストボックスは明示的な顧客の要件でした。基本的に、カスタマイズされたExcelをWeb上に再作成しました)

于 2008-11-11T17:41:11.623 に答える
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 のバージョンは何ですか?

于 2008-11-05T23:37:48.893 に答える
0

DOM と HTTP リクエストの操作は本質的に遅いです。それはブラウザです。高速化する最善の方法は、HTTP リクエスト (AJAX またはその他) の回数を減らし、DOM アクション、検索、編集、置換などの回数を減らすことです。

于 2008-11-10T06:07:15.567 に答える
0

リンク テキストを使用してパフォーマンス トレースを行うことをお勧めします。Internet Explorer での AJAX パフォーマンス分析用の無料ツールです。

于 2009-11-27T16:00:18.513 に答える
0

ポップアップ コントロールのコードは次のとおりです (アイコンを含むすべてのコントロールで共有されるページには、これらの 1 つだけがあります)。

<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>
于 2008-11-05T23:48:17.750 に答える