0

数秒ごとに[データベースに]データを保存する必要があるページがあります.これは、gmailまたはstackoverflowが数秒ごとにドラフトを保存する方法に似ています. これを実現するためにjQuery Ajaxを使用しています。以下は私のAjax呼び出しです:

質問:これは正しい方法ですか? 数秒ごとに接続を開いたり閉じたりするのは苦手です。

function ShowHtml() {
 var SaveStoryForEditing = '<%= Page.ResolveUrl("~")%>Webservices/WebService.asmx/SaveStoryForEditing';

            $('#savedata').html($('#InPlaceEdit').html());
            $("#InPlaceEdit").find("textarea").each(function (idx) {
                $("#savedata").find("textarea").eq(idx).text($(this).val());
            });
            $.ajax({
                type: "POST",
                contentType: "application/json; charset=utf-8",
                url: SaveStoryForEditing,
                dataType: 'json',
                async: false,
                data: "{'StoryEditId':" + $('#hfStoryEditID').val() + ",'AccountId':" + $('#hfAccID').val() + ",'StoryHtml':'" + $('#savedata').html() + "'}", // Page parameter to make sure we load new data
                success: function (data) {
                    var myObject = eval('(' + data.d + ')');

                    $('#InPlaceEdit').effect("highlight", { color: "#ff0000" }, 1000);
                    $('#savedata').html('');
                    AutoSave();

                },
                error: function (result) {
                    AutoSave();
                    alert(JSON.stringify(result));
                }
            });

        };


        function AutoSave() {
            setTimeout("ShowHtml()", 30000);
        };

これは、Web サービスから呼び出している関数です。

Public Shared Function SaveStoryForEditing(ByVal StoryEditId As Integer, ByVal AccountId As Integer, ByVal StoryHtml As String) As Object

        Dim db As SqlDatabase = Connection.Connection
        Dim scalar As Object
        Dim cmdIf As SqlCommand = CType(db.GetSqlStringCommand("UPDATE StoryEdit SET    StoryHtml=@StoryHtml WHERE AccountID=@AccountID AND StoryEditID=@StoryEditID"), SqlCommand)
        db.AddInParameter(cmdIf, "AccountID", DbType.Int32, AccountId)
        db.AddInParameter(cmdIf, "StoryEditID", DbType.Int32, StoryEditId)
        db.AddInParameter(cmdIf, "StoryHtml", DbType.String, StoryHtml)
        scalar = db.ExecuteNonQuery(cmdIf)
        Return scalar


    End Function

これは私の接続オブジェクトクラスです:

Imports Microsoft.Practices.EnterpriseLibrary.Data.Sql
Imports System.Data.SqlClient

Public Class Connection
    Public Shared Function Connection() As SqlDatabase
        Dim db As SqlDatabase = New SqlDatabase(System.Configuration.ConfigurationManager.ConnectionStrings("TripNestConStr").ConnectionString)
        Return db
    End Function


    End Class
4

2 に答える 2

2

これは良い方法ではないと思います。(おそらく) 不要なトラフィックを作成しています。そのような機能が本当に必要な場合は、少なくとも変更を追跡し、最後のサーバー呼び出し後に何かが変更された場合にのみ実行する何らかのメカニズムを検討します。データが変更されていない場合、サーバーにリクエストを送信してデータベースにアクセスする必要はありません。

考慮すべきいくつかのアイデアがありますが、それはすべて、特定の状況とニーズによって異なります。

于 2013-04-14T08:57:14.923 に答える
1

非表示フィールドの種類のフラグを使用して、値が更新されているかどうかを確認しない理由を考えています。テキストエリアのキープレスアップで、非表示の値を true に設定できます。autoSave メソッドで隠しフィールドの値を確認し、true の場合はサーバーに戻るだけです。値を選択したら、再度 false に更新します。オーバーロードの時間を節約するのに役立ちます。もう 1 つの方法は、 true false を保存するのではなく、変更のタイム スタンプを保存し、データベースで最後に更新した時刻を示すグローバル変数を JavaScript で使用することです。グローバル値が非表示フィールドの現在の更新と比較して過去のものである場合は、同期する必要があります。

于 2013-04-14T09:54:31.807 に答える