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)

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したがって、データは問題ないようです (プロパティにドットがないことを除いて?)。では、メソッドのシグネチャを変更する必要がありますか? カスタム モデル バインダーを作成する必要がありますか (これはかなり一般的なシナリオだと思いますが)。

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 に答える