2012-02-11 207 views
2

我试图通过调用ajax webmethod(asp.net)来编辑jqgrid表单中的选择元素。jqgrid表单编辑editoptions选择ajax添加参数

如果我调用一个没有参数的方法,Everythings很好用。

这是代码的摘录:

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的参数,如果我尝试调用一个WebMethod期待一个字符串参数它不工作?

编辑:我没有强调我使用POST来调用webmethod。即使我试图为Oleg suggested on this link,它不工作:(

回答

2

我认为你需要的jqGrid的ajaxSelectOptions参数。例如,如果你需要有选择行的id为发送到WEBMETHOD通过标识的附加id参数因为在dataType: "json"使用,则应该从

0123修改的 buildSelect第一行中的参数上面的代码

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')); 
     } 
    } 
} 

dataUrl可以在函数形式使用的ajaxSelectOptionsdata参数

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

而且,由于您使用行$.parseJSON(data.d)我可以假设你将WebMethod以错误的方式返回数据。通常webmethod的返回值类型应为类别。您不应该包含任何对返回对象进行手动序列化的调用。而不是有些人误解,并宣布string作为网络方法的返回类型。他们通过拨打DataContractJsonSerializerJavaScriptSerializer手动进行JSON序列化。结果手动序列化的数据返回字符串将再次被序列化。这就是为什么你可以有两个调用$.parseJSONvar retValue = $.parseJSON(data); var response = $.parseJSON(retValue.d);。如果你要使用dataType: "json"ajaxSelectOptions里面,如果你在Web方法做无需手动序列化到JSON,只是rejurn对象喜欢它是,你需要有没有通话$.parseJSON可言。你可以直接使用data.d

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

THX奥列格,我应该通过计算器发送UA礼物,最后几天的答案;)无论如何,首先你应该使用:数据后(对于谁可以从这个优势用户话题)。错误改变了,它变成了“无效的json基元”。我解决这个[这次静态]方式的数据:“{'selectedValue':'value'}” – frabiacca 2012-02-11 13:56:08

+1

@frabiacca:我仔细读了你写的关于错误的内容。我认为我的建议应该更正为使用'JSON.stringify()'。如果你在'ajaxSelectOptions'里面使用'type:“POST”',那么你必须使用'data:JSON.stringify({selectedValue:'value'})''。它不舒服,因为你不能使用功能。如果你要在webmethod中使用和使用'UseHttpGet = true'选项,你将能够以'data:{selectedValue:function(){return JSON.stringify($(“#list”) .jqGrid('getGridParam','selrow')); }' – Oleg 2012-02-11 14:13:21

+0

@Oleg我可以直接绑定''string to column without ajax call。 – 2016-12-14 04:11:56