jqgrid格式化程序可以调用ajax/json方法吗?

jqgrid格式化程序可以调用ajax/json方法吗?,jqgrid,jqgrid-formatter,Jqgrid,Jqgrid Formatter,我正在jqGrid中的一列上使用格式化程序。格式化程序使用一些逻辑来决定显示什么,在某些情况下,它调用ajax方法。我已经在Fiddler中验证了ajax调用返回的数据是否正确。我还在Chrome除错工具中验证了我的变量设置是否正确。但是,该序列完全是无序的,因此我列中的返回值是“未定义的”。我可以在调试工具的时间线中看到,我的getJSON调用是在jqgrid已经加载之后被调用的 我先试了一下: function myFormatter(cellvalue, options, rowObjec

我正在jqGrid中的一列上使用格式化程序。格式化程序使用一些逻辑来决定显示什么,在某些情况下,它调用ajax方法。我已经在Fiddler中验证了ajax调用返回的数据是否正确。我还在Chrome除错工具中验证了我的变量设置是否正确。但是,该序列完全是无序的,因此我列中的返回值是“未定义的”。我可以在调试工具的时间线中看到,我的getJSON调用是在jqgrid已经加载之后被调用的

我先试了一下:

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/async=false,并尝试了不同的type和dataType值,但结果都是一样的:

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 "";
    }
}

似乎您应该能够通过使用同步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调用是不好的做法,因为它们会在不确定的时间内阻塞UI。如果网格中有很多行,这种情况可能特别糟糕,因为每行将进行一次AJAX调用

如果可以,更好的方法可能是提前检索ID并在页面上本地缓存它们,或者只在服务器端进行格式化。一如既往,运用你最好的判断