我有一个 Kendo UI 网格,它允许我将多个更改发布到服务器。绑定(bind)到网格的模型包含复杂类型的列表。这是(简化的):
public class User
{
public int ID { get; set; }
public string Name { get; set; }
public List<Role> Roles { get; set; }
}
为了更新服务器上的更改,我的 Controller 中有一个具有以下签名的方法:
public ActionResult UpdateUtilisateurs([DataSourceRequest] DataSourceRequest request, [Bind(Prefix = "models")]IEnumerable<User> users)
users
集合已正确填充,但 Roles
列表为空。我已经使用 Firebug 确保数据实际上是来回序列化的。这是我在到达 Controller 之前更新 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
属性中可能缺少点?)。那么我必须更改方法签名吗?我是否必须创建一个自定义模型绑定(bind)器(尽管我猜这是一个相当常见的场景)?
最佳答案
有完全相同的问题。问题在于子属性的括号(models[0].Roles[0][Code]
而不是 models[0].Roles[0].Code
)。在将数据发送到服务器(或更新默认模型绑定(bind)器)之前,您将需要一个解析函数。
Kendo 支持给我发送了一个解决方案:
在 Ajax 数据源中:
.Update(update => update.Action("Update", "Controller").Data("serialize"))
.Create(create => create.Action("Create", "Controller").Data("serialize"))
稍后在 View (或 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>
如果您计划使用网格来编辑复杂对象的集合,我现在就告诉您,您会后悔您的决定。只是一个友好的警告,可以节省您几天的时间浪费:)
关于asp.net-mvc - 具有复杂子属性的 Kendo 对象的模型绑定(bind)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18149982/