【问题标题】:asp.net jqGrid dropdown multiselectasp.net jqGrid 下拉多选
【发布时间】:2012-04-16 23:55:02
【问题描述】:

我正在尝试在表单编辑 jqGrid(添加表单)中使用 jQuery 多选插件。

这是我用来构建下拉列表的代码(colModel extract):

{ 
    name: 'CaratteristicheCamera',
    index: 'CaratteristicheCamera', 
    width: 50, 
    hidden: true, 
    edittype: 'select',
    editable: true, 
    editrules: { edithidden: true, required: true }, 
    editoptions: {
        multiselect: true,
        dataUrl: '<%# ResolveUrl("~/Service/Domain/ServiceRoom.asmx/GetRoomFeatureList") %>',
        buildSelect: function (data) {
            var retValue = $.parseJSON(data);
            var response = $.parseJSON(retValue.d);

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

            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>";
        },
        dataInit: function() {
            $("#CaratteristicheCamera").multiselect();
        }
    }

},

如你们所见,jqGrid 调用 webmethod 放在 asmx 文件中。一切似乎都正常,但我无法接收用户从下拉列表中选择的所有值。系统似乎将最后的选择发送到服务器。 你有什么建议吗?

编辑:这是 asmx 网络服务声明

[WebMethod]
public string SaveRoom(string id, string codice, string Numero, string NumeroPiano,
                       string Nome, string TipoCamera, string StatoCamera,
                       string CaratteristicheCamera, string TipoSdoppiabilita)
{}

【问题讨论】:

  • 您能否更准确地指定您尝试使用的“多选”插件中的哪个。是 Eric Hynds jQuery UI MultiSelect Widget 吗?您能否更详细地描述现有问题?您写道“我无法接收用户从下拉列表中选择的所有值”。用户选择列表是否被剪切?您还写了另一个问题“系统将最后一个选择发送到服务器”。您是指上一个选择吗?这样如果您第二次打开表单,用户的第一次选择将被发送到服务器?
  • 是的,我正在使用 Eric Hynds 库 (v 1.12)。发生的事情是我单击加号图标添加新实体;它出现在表单中,我可以填写其中的所有字段,并且可以在 CaratteristicheCamera 下拉列表中选择多个项目。然后我点击保存按钮,系统调用 asmx webmethod BUT 在我通过调试看到的参数中,只是最后一个选定的项目。 (我编辑了我的问题)

标签: c#-4.0 jqgrid asmx multi-select


【解决方案1】:

我尝试Eric Hynds jQuery UI MultiSelect Widget 和 jqGrid 3.4.1 并没有看到你描述的任何问题。我建议您将您的演示与我的进行比较以找出差异。

我在您的代码中看到的一件坏事是您在&lt;select&gt; 上设置了id="CaratteristicheCamera" 属性,该属性是在buildSelect 中生成的。您应该只使用 &lt;select&gt; 而不使用任何其他属性。 jqGrid 将为自己设置所有属性,如idmultiple="multiple"

the demo 中,我使用了服务器上不存在的editurl: 'test.asmx/dummy'。所以人们会看到类似的错误消息

选择并提交所选项目后

尽管如此,关于FiddlerFirebug 或 IE 或 Chrome 的开发人员工具(请参阅“网络”选项卡中的 HTTP 流量)等工具,我们可以看到演示发布了类似的数据

{"name":"test8","closed":"No","ship_via":"FE,TN","oper":"edit","id":"8"}

http://www.ok-soft-gmbh.com/jqGrid/test.asmx/dummy。因此所选项目FedEx, TNT 的值"FE,TN" 将按预期发送。在您的情况下,SaveRoomCaratteristicheCamera 参数应初始化为以逗号分隔的选定值列表。如果你把我的demo和青春对比一下,希望你能在你的代码中发现问题。

您发布的代码中的另一个小问题是您在WebMethodGetRoomFeatureList 中手动序列化为JSON 并返回string。因此字符串将被序列化为 JSON 两次。所以你使用

var retValue = $.parseJSON(data);
var response = $.parseJSON(retValue.d);

正确的是返回 List&lt;Room&gt; 之类的内容。 ASP.NET 会自动序列化它。如果你会使用 jqGrid 选项

ajaxSelectOptions: {
    contentType: 'application/json; charset=utf-8',
    dataType: "json"
}

buildSelect 中的 data 根本不需要解析。您可以在循环中直接使用data.d[i].Iddata.d[i].Descrizione。我在another answer 就你的老问题向你提出了同样的问题。

【讨论】:

  • 错误在 dataInit 处理程序中。谢谢奥莱格! (啊,我还没有重构我的代码,因为我非常尊重我们的路线图)
  • @Oleg 当我处于编辑模式时如何获得选中的值?
  • @janina:对不起,我不明白你的问题。编辑的结果会像往常一样发送到服务器。如果选中多个选项,则值将以逗号分隔发送。
  • @Oleg:不,不是那样。当我处于添加模式时,我想要多选下拉菜单,但在编辑模式下,我想要常规下拉菜单而不是多选下拉菜单。我的意思是在编辑模式下我想制作多选假。
猜你喜欢
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
相关资源
最近更新 更多