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);
        };

这是我从网络服务调用的函数:

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

我在想为什么不使用隐藏字段类型的标志来检查值是否更新。在 textarea 的 keypressup 上,您可以将隐藏值设置为 true。在 autoSave 方法中检查隐藏字段的值,如果为真则只返回服务器。一旦您选择了值,再次将其更新回 false 。这样它会帮助你节省一些超载的时间。另一种方法不是保存 true false ,您还可以保存更改的时间戳并在 javascript 中有一个全局变量,它将告诉您上次在数据库中更新的时间。如果全局值过去与隐藏字段中的当前更新相比,则需要同步。

于 2013-04-14T09:54:31.807 回答