我使用的是一个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
导致数据库上传失败。
如果有任何帮助,我将非常感激。
我找到了这个问题的答案。 下面的链接提供了一篇优秀的文章,解释了异步的细微差别。JavaScript
调用,特别是如何在使用 Ajax
: https:/stackify.comreturn-ajax-response-asynchronous-javascript-call。
在我的特殊情况下,解决方法很简单,只需添加一个 async: false
我的 Ajax
"贴 "法。