对jQuery处理我的数据感到困惑

对jQuery处理我的数据感到困惑,jquery,asp.net-mvc,jqgrid,Jquery,Asp.net Mvc,Jqgrid,所以可能不是最好的标题,但我认为这就是正在发生的事情 我写这篇文章是想在我的jqGrid中填充一个dropdownlist,这样用户就可以从可用的选择中进行筛选。提供的解决方案在一个实例中有效,但在另一个实例中无效。它检索数据的第一种类型(用于列标题下拉筛选器)my stack trace如下所示: callback() jquery-1.6.2.js (line 7947) _ = readystatechange done() jquery-1.6.2.js (line 7183) sta

所以可能不是最好的标题,但我认为这就是正在发生的事情

我写这篇文章是想在我的jqGrid中填充一个dropdownlist,这样用户就可以从可用的选择中进行筛选。提供的解决方案在一个实例中有效,但在另一个实例中无效。它检索数据的第一种类型(用于列标题下拉筛选器)my stack trace如下所示:

callback() jquery-1.6.2.js (line 7947)
_ = readystatechange

done() jquery-1.6.2.js (line 7183)
status = 200
statusText = "success"
responses = Object { text="["Cake", "Sugar", "Waffle"]" }
headers = "Server: ASP.NET Develop...: 22\nConnection: Close\n"

resolveWith() jquery-1.6.2.js (line 1008)
context = Object { url="/IceCream/AvailableConeTypes", isLocal=false, more...}
args = [ Object { readyState=4, responseTExt="["Cake", "Sugar", "Waffle"]", more...} "success"]

complete() jquery...src.js(line 3591)
res = Object { readyState=4, responseText="["Cake", "Sugar", "Waffle"]", more...}
status = "success"

myBuildSelect() Cone (line 75)
data = Object { readyState=4, responseText="["Cake", "Sugar", "Waffle"]", more...}
第二次调用时(对于允许您构造多个和/或过滤器的jqGrid工具栏过滤器对话框),堆栈跟踪略有不同:

callback() jquery-1.6.2.js (line 7947)
_ = readystatechange

done() jquery-1.6.2.js (line 7168)
status = 200
statusText = "success"
responses = Object { text="["Cake", "Sugar", "Waffle"]" }
headers = "Server: ASP.NET Develop...: 22\nConnection: Close\n"

resolveWith() jquery-1.6.2.js (line 1008)
context = Object { elem=, options={...} }
args = [ "["Cake", "Sugar", "Waffle"]", "success", Object { readyState=4, responseText="["Cake", "Sugar", "Waffle"]", more...} ]

success() jquery...src.js(line 5099)
data ="["Cake", "Sugar", "Waffle"]"
status = "success"

myBuildSelect() Cone (line 75)
data = ="["Cake", "Sugar", "Waffle"]"
我不知道这里发生了什么事。查看引用行中的jquery-1.6.2.js文件,我发现在第一个实例中,它执行该行:

deferred.resolveWith { callbackContext, [success, statusText, jqXHR] );  (line 7168)
completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText] );  (line 7183)
在第二个实例中,它执行以下行:

deferred.resolveWith { callbackContext, [success, statusText, jqXHR] );  (line 7168)
completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText] );  (line 7183)

第二次调用控制器操作时,缓存或处理的方式似乎有所不同。如果有帮助的话,我可以发布额外的代码,但这基本上是我在前面的问题以及Oleg的解决方案中所写的。想法?

首先,我建议您使用jqGrid的最新4.1.2版本,而不是非常旧的4.0.0版本(您在问题中包含的
jquery.jqGrid.src.js
的行号来自v4.0.0)。版本4.1.2包括许多错误修复

您遇到问题的原因如下。可以使用的
complete
success
error
事件处理程序来处理服务器响应。旧的jqGrid代码到处使用
complete
事件处理程序。这不是最好的方法,所以在很多地方,但不是所有地方(!!!)jqGrid代码都被更改了,并且大多数情况下没有使用
success
error
处理程序。在
complete
处理程序中,
data
参数具有
string
类型(在您的示例中为JSON格式)。因此,需要进行额外的调用以将数据转换为对象。在
success
内部,
数据
已被处理,对应于服务器响应的“Content Type”HTTP头和
$.ajax的
数据类型
参数

可以在jqGrid的源代码中找到,
buildSelect
将在
complete
处理程序中调用,它将在
success
处理程序中调用。这是你的问题

我建议您将问题的描述作为错误报告发布在中,或者我可以为您这样做

作为解决方法,我建议将
buildSelect
函数(我在上一个问题中建议)修改为以下内容:

my.buildSelect = function(data) {
    var response = typeof(data) === "string" ?
                       jQuery.parseJSON(data.responseText):
                       data,
        s = '<select>', i, l, ri;

    if (response && response.length) {
        for (i=0, l=response.length; i<l; i += 1) {
            ri = response[i];
            s += '<option value="' + ri + '">' + ri + '</option>';
        }
    }
    return s + '</select>';
};
my.buildSelect=函数(数据){
var响应=类型(数据)=“字符串”?
jQuery.parseJSON(data.responseText):
数据,
s='',i,l,ri;
if(响应和响应长度){

对于(i=0,l=response.length;i首先,我建议您使用jqGrid的最后4.1.2版本,而不是非常旧的4.0.0版本(您在问题中包含的
jquery.jqGrid.src.js
的行号来自v4.0.0)。版本4.1.2包含许多错误修复

出现此问题的原因如下。可以使用的
complete
success
error
事件处理程序来处理服务器响应。旧的jqGrid代码在任何地方都使用
complete
事件处理程序。这不是最好的方法,因此在许多地方,但不是在任何地方(!!!)jqGrid代码已更改,并且大部分未使用
success
error
处理程序。在
complete
处理程序中,
数据
参数具有
字符串
类型(在本例中为JSON格式)。因此,需要额外调用来将数据转换为对象。
success
中的
数据
已被处理,对应于服务器响应的“Content Type”HTTP头和
$.ajax
数据类型
参数

在jqGrid的源代码中可以发现,
buildSelect
将在
complete
处理程序中调用,它将在
success
处理程序中调用。这就是您遇到的问题

我建议您将问题的描述作为错误报告发布在中,或者我可以为您这样做

作为解决方法,我建议将
buildSelect
函数(我在上一个问题中建议)修改为以下内容:

my.buildSelect = function(data) {
    var response = typeof(data) === "string" ?
                       jQuery.parseJSON(data.responseText):
                       data,
        s = '<select>', i, l, ri;

    if (response && response.length) {
        for (i=0, l=response.length; i<l; i += 1) {
            ri = response[i];
            s += '<option value="' + ri + '">' + ri + '</option>';
        }
    }
    return s + '</select>';
};
my.buildSelect=函数(数据){
var响应=类型(数据)=“字符串”?
jQuery.parseJSON(data.responseText):
数据,
s='',i,l,ri;
if(响应和响应长度){

对于(i=0,l=response.length;我感谢你的鼓励和洞察力Oleg。我在你的帮助下完成了这项工作。调试这些东西可能非常困难(至少对我来说)当它陷入代码的杂草中时,我没有写,也没有真正理解所有的代码。感谢你对jqGrid和jQuery如此精通。谢谢!@itsmart:不客气!谢谢你对我说的好话。谢谢你的鼓励和洞察力Oleg。我在你的帮助下完成了这项工作。这可能非常困难当这些东西陷入我没有写的代码的杂草中时,我会调试它们(至少对我来说是这样)。感谢你对jqGrid和jQuery如此精通。谢谢!@itsmart:不客气!谢谢你对我说的好话。