【问题标题】:How to jsonify "Add" post/parameters for jqGrid如何为 jqGrid jsonify“添加”帖子/参数
【发布时间】:2010-12-29 21:13:39
【问题描述】:

这个要了我的命。我已经阅读了很多 Oleg 的 cmets 和 documentation,但我认为我忽略了一些真的简单的东西。

我通过调用返回 JSON 的 web 方法填充了一个 jqGrid。我们在那里很好。我将 Navigator 用于“添加”按钮,并使用 onSelectRow w/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”。我尝试使用serializeEditDatabeforeSubmit 尝试手动返回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() 填充datatype: function(data),但我想我会回到最简单的例子来让它工作。如果您愿意就使用$.ajax() 与简单使用grid.jqGrid({ url: blah }); 相比的优势提出您的想法,我很想了解更多信息。否则,请让我知道将其作为单独的问题发布是否更合适。

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

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

【问题讨论】:

    标签: web-services json jquery-plugins jqgrid jqgrid-asp.net


    【解决方案1】:

    在我看来,您的主要问题在于 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&amp;ExportDate=12%2F29%2F2010&amp;oper=add&amp;id=_empty

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

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

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

    因为 ModifyFileLog Function 将返回 JSON 数据,您必须对其进行解码/解析。你几乎可以用我描述的here 来做这件事。对于 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];
            }
        }
    );
    

    【讨论】:

    • 是我的英雄,就像他为许多其他问题所做的那样;谢谢,奥列格。我对您的一个 cmets 有一个后续问题(如果我应该开始另一个问题,请告诉我)。 1)如果我返回一个 JSON 对象(使用 NewtonSoft),我需要使用 ResponseFormat.Json 吗? 2) 如果我有 reloadAfterSubmit: true,我需要运行 afterSubmit 吗?此外,使用 VB.NET 2.0,我的函数接受 ExportDate 作为 Nullable(Of DateTime)。
    • @mmengel:欢迎您!我很高兴来到这里,我可以帮助你。关于你的问题。 1) 如果您使用 Newtonsoft 的 Json.NET 库,您可以更好地将 WCF 用作 ASMX Web 服务(参见 stackoverflow.com/questions/3118504/…stackoverflow.com/questions/3078397/…)。在 WCF 中,您可以声明 retutn Stream 并使用自定义序列化程序返回 any 数据类型的方法,因此您可以使用 NewtonSoft 代替标准 ResponseFormat.Json
    • @mmengel: afterSubmitreloadAfterSubmit:true 做完全不同的事情。如果您不能返回新行的Id,您必须使用reloadAfterSubmit:true 的原因。如果您有许多已排序和分页的项目,并且希望以正确的排序顺序查看新添加的项目,则应使用reloadAfterSubmit:true。在其他情况下reloadAfterSubmit:false 可以。用户看到他刚刚添加的项目并且他喜欢它。如果需要始终符合 jqGrid 接口,我更喜欢返回新 ID 并使用afterSubmit,并且更确定在新的 jqGrid 版本中我的程序可以正常工作。
    • @mmengel:如果在您的语言环境中使用ExportDate 作为Nullable(Of DateTime) 工作正常,那么您可以使用它。我没有复制你的程序,也不确定一切都会奏效。我个人更喜欢使用独立于语言的格式进行数据传输,但在现实世界中这不是强制性的。
    猜你喜欢
    • 2017-09-05
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多