ASP.NET MVC 和 WebAPI 使用数据库插入和检索记录 table

ASP.NET MVC and WebAPI inserting and retriveing records with database table

我目前正在使用 ASP.NET 创建网页。

我在以下位置有一个页面:myUrl/INVs/Transaction

从用户的角度来看:我现在实际做的是在我的页面中创建一个项目列表。然后在我按下保存按钮之后。刷新同一页面以显示我刚才创建的项目。

在我按下保存按钮后的视图中,它执行以下 javascript 代码:

 //some javascript code written here. 
 for (i = 0; i < rowCount; i++) {
   //some javascript code written here. 

   $.ajax({
          type: 'POST',
          data: { 'obj': newYTDTRNIObj },
          url: '/INVs/ProcessCreateYTDTRNIAsync',
          success: function (data) {
          console.log(data);


         }
         });

 }
 if (currentVoucherNumIsEmpty) {
    $.ajax({
           type: 'POST',
           data: { 'obj': newInvVouchObj },
           url: '/INVs/ProcessPatchTABVOUAsync',
           success: function (data) {

           if (currentPageTitle == "Inventory Receipt- Misc Receipt") {
                            location.href = currentUrl + "INVs/Transaction?tType=1&id=" + newInvVouchObj.PREFIX + newInvVouchObj.VOUCHNO;


           } else if (currentPageTitle == "Inventory Receipt- Return To Stock") {
                            location.href = currentUrl + "INVs/Transaction?tType=2&id=" + newInvVouchObj.PREFIX + newInvVouchObj.VOUCHNO;

           } else if (currentPageTitle == "Inventory Receipt- Production Receipt") {
                            location.href = currentUrl + "INVs/Transaction?tType=3&id=" + newInvVouchObj.PREFIX + newInvVouchObj.VOUCHNO;

           } else if (currentPageTitle == "Inventory Receipt- Purchase Receipt") {
                            location.href = currentUrl + "INVs/Transaction?tType=4&id=" + newInvVouchObj.PREFIX + newInvVouchObj.VOUCHNO;

           } else if (currentPageTitle == "Inventory Issue- Misc Issue") {
                            location.href = currentUrl + "INVs/Transaction?tType=5&id=" + newInvVouchObj.PREFIX + newInvVouchObj.VOUCHNO;

           } else if (currentPageTitle == "Inventory Issue- Production Issue") {
                            location.href = currentUrl + "INVs/Transaction?tType=6&id=" + newInvVouchObj.PREFIX + newInvVouchObj.VOUCHNO;

           }

           }
           }); 

 }

它通过两次 ajax 调用将数据发送到控制器。在第二次 ajax 调用的成功函数中,它再次重定向回相同的视图,只是这次它带有参数。

当使用这些参数调用视图时,它实际上加载并显示由上面的 c# 函数插入数据库的那些记录:ProcessCreateYTDTRNIAsync

下面是我的 C# 代码:

[HttpPost]
public async Task<string> ProcessCreateYTDTRNIAsync(INV_YTDTRNIObj obj, bool edit = false, bool issue = false)
{
        // some c# code written here. 

        var postTask = createclient.PostAsJsonAsync<YTDTRNI>("api/INV_API/postYTDTRNI", newYTDRNI);
                postTask.Wait();

                var result = postTask.Result;
                if (result.IsSuccessStatusCode){
                }

                return "Record created";
}

[Route("api/INV_API/postYTDTRNI/")]
public async Task<string> PostYTDTRNIAsync(YTDTRNI ytdtrniObj)
{

        db.YTDTRNIs.Add(ytdtrniObj);
        await db.SaveChangesAsync();

        return "YTDTRNI object created";
}


[HttpPost]
public async Task<string> ProcessPatchTABVOUAsync(TABVOU obj)
{

        // some c# code written here. 

        HttpClient client = new HttpClient();
        var result = await client.SendAsync(request);
        if (result.IsSuccessStatusCode)
        {

        }
        return "Updated voucher number";


}

我注意到的是:当我插入 2 条记录时,有时会在显示我的视图后将第二条记录插入到数据库中 table。所以我的视图只显示 inserted.It 的第一条记录是不一致的行为,在其他时候,这 2 条记录被插入到数据库中 table 并且当页面刷新时,它显示 2 条记录.

发生这种情况是因为我没有等待 first ajax 完成才刷新页面吗?

这就是所谓的Ajax Cacheing

Ajax 将缓存您的结果,因此除非刷新页面或禁用缓存,否则您不会在视图中看到更新的数据。

您可以尝试几件事,首先是 将您的 Ajax cahce 设置为 false:

  $.ajax({
           type: 'POST',
           data: { 'obj': newInvVouchObj },
           url: '/INVs/ProcessPatchTABVOUAsync',
           cache: false,
           success: function (data) {

或全局 ajaxSetup():

$.ajaxSetup({ cache: false });

我使用了另一个question

中提到的方法

我创建了一个数组,用于存储 ajax 将数据插入数据库的请求的所有承诺。

然后我使用 $.when.apply(null, promises).done 来确保 for 循环中的 ajax 请求在刷新页面之前完成。这可确保在刷新页面之前将所有数据插入数据库。