如何获取Kendo Multi Select的选定值?

时间:2017-01-15 18:49:44

标签: javascript c# jquery asp.net-mvc telerik

我正在使用Kendo multi select,但我无法获得选定的值

var multiselect = $("#SelectRoles").data("kendoMultiSelect");
var selectedData= [];
var items = multiselect.value();
for (var itm in items)
{
   selectedData.push(itm);
}

但是array selectedData返回multiselect中的项目索引而不是值。

5 个答案:

答案 0 :(得分:2)

使用另一个返回索引。

var multiselect = $("#SelectRoles").data("kendoMultiSelect");
var selectedData= [];
var items = multiselect.value();
for (var i=0;i<items.length;i++)
{
   selectedData.push(items[i]);
}

答案 1 :(得分:2)

您还可以将从value()方法返回的数组直接分配给变量,例如:

var ms = $("#multiselect").kendoMultiSelect({
  value: ["1", "2"]
}).data('kendoMultiSelect');

var selectedItems = ms.value();
console.log(selectedItems); // ["1", "2"]

答案 2 :(得分:1)

您的原始代码看起来没错。你确定你只获得指数吗?也许你应该发布你的MultiSelect代码。我发现了这个问题,因为我遇到了同样的问题并使用了其他答案作为参考,但我发现它们过于复杂。那么让我以另一种复杂的方式回答:)

这就是我所拥有的。我知道它的代码比你需要的多,但我认为在这里看到完整的图片非常重要。首先让我来说明一下。如果您多次使用它,则会出现Kendo()。MultiSelect.Name(“SomeName”)属性的问题。 “Name”不仅设置了html名称,还设置了id,并且你永远不会想要两个具有相同标识符的id。因此,在我的代码中,我将一个唯一的ID附加到我的MultiSelect.Name属性以确保唯一的ID。我将MultiSelect放在人员表的每一行中。我显示这是为了确保您使用DataValueField属性,以便您能够获取所选的值(而不是您在ui中看到的文本)。如果您只是显示一个没有id的文本值列表,那么这可能就是您获取错误数据的原因?

@foreach (var cm in Model.CaseMembers)
{
<tr>
<td>
    @(Html.Kendo().MultiSelect()
      .Name("IsDelegateFor" + cm.CaseMemberId)                              
      .Placeholder("is a delegate for..")
      .DataTextField("FullName")
      .DataValueField("CaseMemberId")
      .BindTo(Model.Attorneys)
    )
</td>
</tr>
}

然后,在我的jQuery中,我尝试提取DataValueField(CaseMemberId),这是MultiSelect的选定值的数组......

var sRows = [];
$('#cmGrid tr').each(function () {
    // 'this' is a tr
    $tr = $(this);
    // create an object that will hold my array of selected values (and other stuff)
    var rec = {};   
    rec.IsADelegateFor = [];        
    // loop over all tds in current row
    $('td', $tr).each(function (colIndex, col) {
        if (colIndex === 3) {
            // make sure our MultiSelect exists in this td
            if ($(this).find("#IsDelegateFor" + rec.CaseMemberId).length) {                        
                // it exists, so grab the array of selected ids and assign to our record array
                rec.IsADelegateFor = $(this).find("#IsDelegateFor" + rec.CaseMemberId).data("kendoMultiSelect").value();                        
            }
        }
    }
    // add this tr to the collection
    sRows.push(rec);
}

所以这是一个超级冗长的方式,说这个单行,正如其他人提到的那样完美地抓住了ID。无需迭代.value()数组并将内容推送到另一个数组!

rec.IsADelegateFor = $(this).find("#IsDelegateFor" + rec.CaseMemberId).data("kendoMultiSelect").value();  

因此,在原始代码中,没有理由不能使用以下内容,

var multiselect = $("#SelectRoles").data("kendoMultiSelect");
var selectedData = [];
selectedData = multiselect.value();
console.log(selectedData);

除非

  • 您没有在带有DataValueField的C#中正确设置MultiSelect
  • 您在页面上有多个具有完全相同ID的MultiSelects,而且它的读数与您想象的不同。
  • 您甚至没有值字段,只有文本列表。

答案 3 :(得分:0)

volvox给出的解决方案有效。

以下是jquery版本,

var multiselect = $("#SelectRoles").data("kendoMultiSelect");
var selectedData= [];
var items = multiselect.value();
$.each(items ,function(i,v){
  selectedData.push(v);
});

答案 4 :(得分:0)

var selected = $("#multi").data("kendoMultiSelect").value();