剑道UI MultiSelect将绑定值发送到控制器
本文关键字:控制器 绑定 UI MultiSelect 剑道 | 更新日期: 2023-09-27 18:10:28
我有multiselect widget
@(Html.Kendo().MultiSelect()
.Name("SupportedLanguages")
.Filter(FilterType.Contains)
.Placeholder("Select supported languages...")
.BindTo((System.Collections.IEnumerable)ViewData["supportedLanguages"]))
supportedLanguages
只是字符串数组
return new[] { "pl", "en", "sv" };
MultiSelect绑定值正确,我可以从列表中选择语言,但是当我将这些值返回到控制器时,我得到了这样的post参数
SupportedLanguages[]=pl&SupportedLanguages[]=sv&SupportedLanguages[]=en
所以MVC绑定器不能将这些值正确地绑定到我的ViewModel。
ViewModel只是一个简单的类,只有一个属性
public List<string> SupportedLanguages { get; set; }
我做错了什么?
我不知道这种实现的原因,但这里是解决问题的方法。使用Ajax绑定的网格内MultiSelect示例:
//Model
public class Model
{
public Guid Id { get; set; }
[Required]
public string Name { get; set; }
/*MultiSelect for this property*/
public IEnumerable<ChildModel> Children { get; set; }
}
//View
@Html.Kendo().Grid<Model>()
.Name("Grid")
...
.DataSource(cfg => cfg
.Ajax()
.PageSize(20)
.Model(c => c.Id(e => e.Id))
.Update(c => c.Action("GridUpdate", "MyController").Data("getUpdateData"))
)
//JS
var getUpdateData = function(data) {
MultiSelectHelpers.serialize(data);
};
var MultiSelectHelpers = {
serialize: function (data) {
for (var property in data) {
if ($.isArray(data[property])) {
this.serializeArray(property, data[property], data);
}
}
},
serializeArray: function (prefix, array, result) {
for (var i = 0; i < array.length; i++) {
if ($.isPlainObject(array[i])) {
for (var property in array[i]) {
result[prefix + "[" + i + "]." + property] = array[i][property];
}
}
else {
result[prefix + "[" + i + "]"] = array[i];
}
}
}
}