2

我有一个 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)

集合被正确填充,usersRoles列表为空。我使用 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属性中缺少的点?)。那么我必须更改方法签名吗?我是否必须创建一个自定义模型绑定器(尽管我猜这是一个相当常见的场景)?

4

1 回答 1

3

有完全相同的问题。问题在于子属性的括号(models[0].Roles[0][Code]而不是models[0].Roles[0].Code)。在将数据发送到服务器(或更新默认模型绑定器)之前,您需要一个解析函数。

剑道支持给我一个解决方案:

在 Ajax 数据源中:

.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>

如果你的计划是使用网格来编辑复杂对象的集合,我现在就告诉你,你会后悔你的决定。只是一个友好的警告,可以为您节省几天浪费的时间:)

于 2013-08-09T15:28:33.397 回答