jqgrid表单编辑editoptions选择ajax add参数

时间:2012-02-11 12:09:22

标签: asp.net jqgrid

我试图通过调用ajax webmethod(asp.net)在编辑jqgrid的表单中构建一个select元素。

如果我调用没有参数的方法,那么Everythings工作得很好。如果我尝试调用一个期望字符串参数的web方法,它就无法工作:

这是代码的摘录:

ajaxSelectOptions: { type: "POST", contentType: 'application/json; charset=utf-8', },
colNames: ['City', 'State'],
colModel: [
{ 
    name: 'City', 
    index: 'City', 
    align: "center", 
    width: 80, 
    searchoptions: { sopt: ['eq', 'ne', 'cn']} ,
    edittype: 'select',
    editable: true, 
    editrules: { required: true },
    editoptions: { 
        dataUrl: '<%# ResolveUrl("~/Service/Domain/ServiceGeographic.asmx/GetCityByState") %>',
        buildSelect: function (data) {
        var retValue = $.parseJSON(data);
        var response = $.parseJSON(retValue.d);

        var s = '<select id="customer_City" name="customer_City">';

        if (response && response.length) {
            for (var i = 0, l = response.length; i < l; i++) {
            s += '<option value="' + response[i]["Id"] + '">' + response[i]["Descrizione"] + '</option>';
            }
        }

        return s + "</select>";
        }                        
    }
},
...

在哪里可以设置要发送到GetCityByState webmethod的参数?

编辑:我没有强调我使用POST调用webmethod。即使我尝试Oleg suggested on this link,它也不起作用:(

1 个答案:

答案 0 :(得分:2)

我认为你需要jqGrid的ajaxSelectOptions参数。例如,如果您需要将所选行的ID作为id参数发送到dataUrl标识的webmethod,则可以在函数表单中使用data ajaxSelectOptions参数:

ajaxSelectOptions: {
    type: "GET", // one need allows GET in the webmethod (UseHttpGet = true)
    contentType: 'application/json; charset=utf-8',
    dataType: "json",
    cache: false,
    data: {
        id: function () {
            return JSON.stringify($("#list").jqGrid('getGridParam', 'selrow'));
        }
    }
}

因为在上面的代码中使用了参数dataType: "json",您应该修改buildSelect的第一行

buildSelect: function (data) {
    var retValue = $.parseJSON(data);
    var response = $.parseJSON(retValue.d);
    ...

buildSelect: function (data) {
    var response = $.parseJSON(data.d);
    ...

此外,因为您使用了行$.parseJSON(data.d),我可以假设您以错误的方式从web方法返回数据。通常,webmethod的返回值类型应为 class 。您不应该包含对返回对象的任何手动序列化调用。而不是那些人误解了这一点并将string声明为web方法的返回类型。他们通过调用DataContractJsonSerializerJavaScriptSerializer手动进行JSON序列化。结果,以字符串形式返回的手动序列化数据将再次序列化。这就是为什么您可以$.parseJSONvar retValue = $.parseJSON(data); var response = $.parseJSON(retValue.d);进行两次调用的原因。如果您将在dataType: "json"内使用ajaxSelectOptions,并且如果您在网络方法中执行没有手动序列化为JSON 并且只是重新调整对象,则需要根本没有$.parseJSON没有来电。您可以直接使用data.d

buildSelect: function (data) {
    var response = data.d;
    ...