簡體   English   中英

ASP.NET MVC和WebAPI插入和檢索帶有數據庫表的記錄

[英]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條記錄時,在某些情況下,顯示我的視圖后,第二條記錄將插入數據庫表中。 所以我的視圖僅顯示插入的第一條記錄,這是一個不一致的行為,有時將2條記錄插入數據庫表中,並在刷新頁面時顯示2條記錄。

發生這種情況是因為在刷新頁面之前我沒有等待第一個ajax完成嗎?

這就是所謂的Ajax緩存

Ajax將檢查結果,因此除非刷新頁面或禁用緩存,否則您將在視圖中看不到更新的數據。

您可以嘗試幾種方法,首先將Ajax cahce設置為false

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

或全局使用ajaxSetup()

$.ajaxSetup({ cache: false });

我利用了另一個問題中提到的方法

我創建了一個數組,該數組將存儲將數據插入數據庫的ajax請求的所有promise。

然后,我使用$.when.apply(null, promises).done來確保在刷新頁面之前,for循環中的ajax請求已完成。 這樣可以確保在刷新頁面之前將所有數據插入數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM