2012-09-21 87 views
1

我在jqGrid的某個列上使用格式器。格式化程序使用一些邏輯來決定顯示什麼,並且在某些情況下,它調用ajax方法。我已經在Fiddler中驗證過來自我的ajax調用的正確數據。我也通過Chrome消除工具驗證了我的變量已經正確設置。但是,序列完全沒有意義,所以我列中的返回值是「未定義的」。我可以在調試工具的時間表中看到,我的getJSON調用在jqgrid已經被加載後得到調用。jqgrid格式化程序可以調用ajax/json方法嗎?

我想這第一:

function myFormatter(cellvalue, options, rowObject) 
{ 
    if (rowObject[0] == something) { 
     $.getJSON('@Url.Action("MyAction", "MyController"), function (myResult) { 
      var myObject = myResult[0]; 
      return myObject.myID; 
     }); 
    } 
    else { 
     return ""; 
    } 
} 

我使用Ajax調用也試圖W /異步=假,我試過的類型和數據類型不同的值,但結果都是一樣的:

function myFormatter(cellvalue, options, rowObject) 
{ 
    if (rowObject[0] == something) { 
     $.ajax({ 
      type: 'POST', 
      url: '@Url.Action("MyAction", "MyController"), 
      async: false, 
      success: (function(result) { 
       var myObject = myResult[0]; 
       return myObject.myID; 
      }) 
     });   
    } 
    else { 
     return ""; 
    } 
} 

回答

2

好像你應該能夠得到這個通過使用同步AJAX調用和封閉的工作:

function myFormatter(cellvalue, options, rowObject) 
{ 
    var value = ""; 

    if (rowObject[0] == something) { 
     $.ajax({ 
      type: 'POST', 
      url: '@Url.Action("MyAction", "MyController"), 
      async: false, 
      success: (function(result) { 
       var myObject = myResult[0]; 
       value = myObject.myID; 
      }) 
     });   
    } 

    return value; 
} 

一般來說,儘管使用同步AJAX調用是不好的做法,因爲它們可能會阻塞用戶界面不確定的時間。如果你的網格中有很多行,這種情況可能會特別糟糕,因爲每行會產生一次AJAX調用。

如果可以,更好的方法可能是提前檢索ID並在本地緩存它們,或者只是在服務器端進行格式化。一如既往,用你最好的判斷力。

相關問題