0

这个要了我的命 我已经阅读了很多Oleg的评论和文档,但我认为我忽略了一些非常简单的东西。

我通过调用返回 JSON 的 web 方法填充了一个 jqGrid。我们在那里很好。我将导航器用于“添加”按钮,并使用onSelectRoww/jqGrid.editRow()进行编辑。

单击“添加”按钮时出现对话框,并且可以填写所有内容。但是,error Status: 'Internal Server Error'. Error code: 500单击“提交”按钮后我收到一条返回消息。使用 Firebug,Response{"Message":"Invalid JSON primitive: FileType.","StackTrace":..... 并且PostFileType=3&ExportDate=12%2F29%2F2010&oper=add&id=_empty

显然,我的帖子没有得到“jsonified”。我尝试使用serializeEditData, 并beforeSubmit尝试手动 return JSON.stringify(eparams);,但没有任何效果。请在下面查看我的代码。

网络方法

<WebMethod()> _
<ScriptMethod()> _
Public Sub ModifyFileLog(ByVal FileType As String, _
  ByVal ExportDate As Nullable(Of Date), _
  ByVal oper As String, ByVal id As String)
    Try
        ' blah
    Catch ex As Exception
        Throw New Exception(ex.Message)
    End Try
End Sub

JS - 全局变量

jQuery.extend(
    jQuery.jgrid.defaults, {
        type: "POST",
        mtype: "POST",
        datatype: "json",
        ajaxGridOptions: { contentType: "application/json" },
        ajaxRowOptions: { contentType: "application/json" },
        rowNum: 10,
        rowList: [10, 20, 30],
        serializeGridData: function(data) {
            return JSON.stringify(data);
        },
        gridview: true,
        viewrecords: true,
        sortorder: "asc"
    },
    jQuery.jgrid.edit, {
        ajaxEditOptions: { contentType: "application/json" },
        recreateForm: true,
        serializeEditData: function(postData) {
            return JSON.stringify(postData);
        }
    }
);

JS-jqGrid

var tblName = "tblFiles";
var pager1 = '#pagerFiles';
var grid = $("#" + tblName);
grid.jqGrid({
    url: 'WebService.asmx/GetFileLog',
    colNames: ['ID', 'File Type', 'Report Date', 'Export Date', 'EE Count'],
    ajaxGridOptions: {
        success: function(data, textStatus) {
            if (textStatus == "success") {
                ReceivedClientData(JSON.parse(getMain(data)).rows, grid);  // populates grid
                endGridRequest(tblName);    // hides the loading panel
            }
        },
        error: function(data, textStatus) {
            alert(textStatus);
            alert('An error has occured retrieving data!');
        }
    },
    editurl: "WebService.asmx/ModifyFileLog",
    serializeEditData: function(postData) {
        return JSON.stringify(postData);
    },
    recreateForm: true,
    pager: pager1,
    ...
}); // end .jqGrid()
grid.jqGrid('navGrid', pager1, { add: true, del: false, edit: true, view: false, refresh: true, search: false },
    {}, // use default settings for edit
    {
        //beforeSubmit: submitAddFileLog,
        closeAfterAdd: false,
        closeAfterEdit: true
    }, // use default settings for add
    {},  // delete instead that del:false we need this
    {multipleSearch: false }, // enable the advanced searching
    {closeOnEscape: true} /* allow the view dialog to be closed when user press ESC key*/
); // end grid/jqGrid('navGrid')

注意:我开始使用$.ajax()by来填充datatype: function(data),但我想我会回到最简单的例子来让它工作。$.ajax()如果您愿意就 using比简单 using的优势提出您的想法grid.jqGrid({ url: blah });,我很乐意了解更多信息。否则,请让我知道将其作为单独的问题发布是否更合适。

另外,如果我只是以错误的方式做这件事,请告诉我。我不拘泥于任何一种方法来完成这项工作。我宁愿犯错并学习如何以正确的方式做到这一点,而不是在自己的脑海中保持“正确”并继续破解我的方式。

任何帮助,连同示例,将不胜感激。

4

1 回答 1

2

在我看来,您的主要问题在于JS-Globals。您以错误的方式使用jQuery.extend函数。你应该换一个电话

jQuery.extend(
    jQuery.jgrid.defaults, {
        // ...
    },
    jQuery.jgrid.edit, {
        // ...
    }
);

两个单独的电话:

jQuery.extend(
    jQuery.jgrid.defaults, {
        // ...
    }
);
jQuery.extend(
    jQuery.jgrid.edit, {
        // ...
    }
);

之后,对服务器的编辑请求将{"FileType":3,"ExportDate"="12/29/2010","oper":"add","id":"_empty"}代替FileType=3&ExportDate=12%2F29%2F2010&oper=add&id=_empty.

接下来,我不确定您是否可以ExportDate用作DateDateTime???)类型。可能您应该从String类型开始,然后将输入数据转换为您需要的数据类型。

下一句。确保ModifyFileLog返回 JSON 数据。例如,您可以使用<ScriptMethod(ResponseFormat:=ResponseFormat.Xml)>而不是<ScriptMethod()>. 如果您使用 .NET 4.0,您可以通过许多其他方式实现相同的目标。

还有一件事。ModifyFileLog应该Function代替Sub并返回新添加的Id对象。在编辑或删除操作的情况下,返回值将被忽略。

因为ModifyFileLog Function将返回 JSON 数据,您必须对其进行解码/解析。您几乎可以按照我在此处描述的相同方式执行此操作。对于 ASMX Web 服务,您可以执行以下操作:

jQuery.extend(
    jQuery.jgrid.edit, {
        ajaxEditOptions: { contentType: "application/json" },
        recreateForm: true,
        serializeEditData: function(postData) {
            return JSON.stringify(postData);
        },
        afterSubmit: function (response, postdata) {
            var res = jQuery.parseJSON(response.responseText);
            return [true, "", res.d];
        }
    }
);
于 2010-12-29T23:20:22.800 回答