与具有复杂子属性的Kendo对象建模绑定问题

时间:2013-08-09 15:11:19

标签: asp.net-mvc grid model-binding kendo-grid

我有一个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属性中缺少的点?)。那么我必须改变方法签名吗?我是否必须创建一个自定义模型绑定器(虽然我想这是一个相当常见的场景)?

1 个答案:

答案 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>

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

相关问题