我有一个Kendo UI网格,允许我向服务器发布多个更改。绑定到网格的模型包含复杂类型的列表。这是(简化):
public class User
{
public int ID { get; set; }
public string Name { get; set; }
public List<Role> Roles { get; set; }
}
要更新服务器上的更改,我在控制器中有一个带有以下签名的方法:
public ActionResult UpdateUtilisateurs([DataSourceRequest] DataSourceRequest request, [Bind(Prefix = "models")]IEnumerable<User> users)
users
集合已正确填充,但Roles
列表为空。我确保使用Firebug,数据实际来回串行化。这是在我到达控制器之前更新1行时的POST:
filter
group
models[0].ID 16
models[0].Name Amir Majic
models[0].Roles[0][Code] dbadmin
models[0].Roles[0][Description] Database Administrator
models[0].Roles[0][ID] 33
sort
所以数据似乎没问题(除了Roles
属性中缺少的点?)。那么我必须改变方法签名吗?我是否必须创建一个自定义模型绑定器(虽然我想这是一个相当常见的场景)?
答案 0 :(得分:3)
有完全相同的问题。问题在于子属性的括号(models[0].Roles[0][Code]
而不是models[0].Roles[0].Code
)。在将数据发送到服务器之前,您需要一个解析函数(或更新默认的模型绑定器)。
Kendo支持给我一个解决方案:
在Ajax DataSource中:
.Update(update => update.Action("Update", "Controller").Data("serialize"))
.Create(create => create.Action("Create", "Controller").Data("serialize"))
稍后在视图中(或JS文件)
<script>
function serialize(data) {
for (var property in data) {
if ($.isArray(data[property])) {
serializeArray(property, data[property], data);
}
}
};
function serializeArray(prefix, array, result) {
for (var i = 0; i < array.length; i++) {
for (var property in array[i]) {
result[prefix + "[" + i + "]." + property] = array[i][property];
}
}
}
</script>
如果您的计划是使用网格编辑复杂对象的集合,我现在就告诉您,您会后悔自己的决定。只是一个友好的警告,为您节省几天的浪费时间:))