【问题标题】:jqgrid form editing editoptions select ajax add parameterjqgrid表单编辑editoptions选择ajax添加参数
【发布时间】:2012-03-03 15:34:42
【问题描述】:

我正在尝试通过调用 ajax webmethod (asp.net) 在表单编辑 jqgrid 中构建一个选择元素。

如果我调用没有参数的方法,一切都会很好。如果我尝试调用期望字符串参数的 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 网络方法?

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

【问题讨论】:

    标签: asp.net jqgrid


    【解决方案1】:

    我认为你需要 jqGrid 的ajaxSelectOptions 参数。例如,如果您需要将所选行的 id 作为附加的id 参数发送到由dataUrl 标识的webmethod,您可以在函数形式中使用ajaxSelectOptionsdata 参数:

    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 方法的返回值类型应该是 class。您不应该包含任何对返回对象的手动序列化调用。相反,有些人误解了这一点并将string 声明为webmethod 的返回类型。他们通过调用DataContractJsonSerializerJavaScriptSerializer 手动进行JSON 序列化。结果,作为字符串返回的手动序列化数据将再序列化一次。这就是为什么你可以有两个调用$.parseJSON:var retValue = $.parseJSON(data); var response = $.parseJSON(retValue.d);。如果您将在ajaxSelectOptions 中使用dataType: "json",并且如果您要在Web 方法中不对JSON 进行手动序列化 并且只是像它一样重新生成对象,那么您需要根本没有 打电话给$.parseJSON。你可以直接使用data.d

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

    【讨论】:

    • thx oleg,我应该通过 stackoverflow 给你送一份礼物,作为最后几天的答案;)无论如何,首先你应该使用 : after data (对于可以从这个主题中受益的用户)。错误发生了变化,它变成了“无效的 json 原语”。我解决了这个[这次静态]方式数据:“{'selectedValue':'value'}”
    • @frabiacca:我仔细阅读了你写的关于错误的内容。我认为我的建议应该更正为使用JSON.stringify()。如果您在ajaxSelectOptions 中使用type: "POST",则必须使用data: JSON.stringify({ selectedValue: 'value' })。这不舒服,因为你不能使用功能。如果您要在 web 方法中使用和使用 UseHttpGet = true 选项,您将能够以以下形式使用 datadata: { selectedValue: function () { return JSON.stringify($("#list").jqGrid('getGridParam', 'selrow')); }
    • @Oleg 我可以直接将 '' 字符串绑定到列而不需要任何 ajax 调用吗?
    • @ShamseerKSmr:是的,当然。你只需要使用edittype: "select"(见the documentation
    • @Oleg 但在这种情况下,我还必须将键值对设置为值属性对吗? editoptions: { value: serviceKeyValuePair......
    猜你喜欢
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多