服务器端方法不会向数据库写入数据,除非客户端调用者被暂停中断(通过警报)。

问题描述 投票:0回答:1

我使用的是一个Ajax post 方法,将JSON字符串传递给服务器端的 MVC 行动。 该 IActionResult 方法将JSON字符串解析成一个 array 上传到SQL Server中,通过 Microsoft.Data.SqlClient 的方法。 该 IActionResult 返回一个 Ok() 结果在完成后发送给调用者。

我观察到的异常情况是,只有在我暂停中断浏览器的情况下,数据库上传(服务器端)才会完成,在浏览器中放置一个 alert 就在Ajax方法之后(客户端)。 我的代码如下。

客户端:

function ExportJSON() {
    var myJson = "some JSON stuff goes here";
    $.ajax({
        type: "POST",
        url: "/Dailies/UploadJson/",
        dataType: 'json',
        data: { jsonString: myJson },
            success: function (data) {
                console.log(data);
            }
    });
    alert("Your data has been saved.");
}

服务器端动作。

[HttpPost]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<IActionResult> UploadJson(string jsonString)
{
    if (jsonString != null) {
        var myJArray = JsonConvert.DeserializeObject<JArray>(jsonString);
        TimePunches[] timePunches = myJArray.ToObject<TimePunches[]>();

        try 
        {
            string constr = _configuration.GetConnectionString("MYSQLSERVER");
            using (SqlConnection sqlConnection = new SqlConnection(constr)) {
                await sqlConnection.OpenAsync();
                foreach (TimePunches timePunch in timePunches) {
                    string query = "INSERT INTO TimePunches([Projectid], [CrewLeaderId]) ";
                    query += "VALUES(@Projectid, @CrewLeaderId) ";
                    using (SqlCommand cmd = new SqlCommand(query)) {
                        cmd.Connection = sqlConnection;
                        cmd.Parameters.AddWithValue("@Projectid", timePunch.Projectid);
                        cmd.Parameters.AddWithValue("@CrewLeaderId", timePunch.CrewLeaderId);
                        await cmd.ExecuteNonQueryAsync();
                    }
                }
                sqlConnection.Close();
            }
        }
        catch (Exception ex) {
            TempData["msg"] = ex.Message;
        }
    }
    return Ok();
}

重申一下,服务器端的动作会把数据上传到数据库(如预期的那样),只要是 alert 在客户端中存在 ExportJSON() 方法。 反之,去掉 alert 导致数据库上传失败。

如果有任何帮助,我将非常感激。

ajax async-await sqlclient
1个回答
0
投票

我找到了这个问题的答案。 下面的链接提供了一篇优秀的文章,解释了异步的细微差别。JavaScript 调用,特别是如何在使用 Ajax: https:/stackify.comreturn-ajax-response-asynchronous-javascript-call。

在我的特殊情况下,解决方法很简单,只需添加一个 async: false 我的 Ajax "贴 "法。

© www.soinside.com 2019 - 2024. All rights reserved.