我有多选小部件
@(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正确绑定值,我可以从列表中选择语言,但是当我将这些值发回控制器时,我得到了这样的帖子参数
SupportedLanguages[]=pl&SupportedLanguages[]=sv&SupportedLanguages[]=en
所以MVC binder无法正确地将这些值绑定到我的ViewModel。
ViewModel只是一个带有一个属性的简单类
public List<string> SupportedLanguages { get; set; }
我做错了什么?
答案 0 :(得分:2)
我不知道这种实现的原因,但这里是问题的解决方法。使用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];
}
}
}
}