使用AJAX绑定时,具有IEnumerable属性的Kendo Grid模型在创建/更新后无法正确更新

阿列霍

我遇到一个问题,当将模型的属性发送到控制器以进行Kendo网格的Update或Create调用时,模型的属性未正确更新。该模型如下所示:

public class ReleaseNotesModel
{
    public int NoteID { get; set; }
    public int ReleaseID { get; set; }
    public List<TranslationModel> ReleaseNoteTranslations { get; set; }
    public ReleaseNoteType ItemType { get; set; }
}
public class TranslationModel
{
    public int TranslationID { get; set; }
    public string Translation { get; set; }
    public int LanguageID { get; set; }
    public int ItemID { get; set; }
}

我认为这是网格:

@(Html.Kendo().Grid<ReleaseNotesModel>()
    .Name("Grid")
    .Columns(columns =>
    {
        columns.Bound(m => m.ItemType).Width(140);
        columns.Bound(m => m.Description);
        columns.Command(command =>
            {
                command.Edit();
                command.Destroy();
            }).Width(170);
    })
    .ToolBar(toolbar => toolbar.Create())
    .Editable(editable => editable
        .Mode(GridEditMode.PopUp)
        .TemplateName("ReleaseNoteTemplate")
        .Window(w => w.Width(620))
        .DisplayDeleteConfirmation(true)
    )
    .Pageable()
    .Sortable()
    .Scrollable()
    .Filterable()
    .DataSource(dataSource => dataSource
        .Ajax()
        .ServerOperation(false)
        //.Server()
        .Events(e => e.Error("grid_error"))
        .Model(model =>
        {
            model.Id(m => m.NoteID);
            model.Field(m => m.ReleaseID).DefaultValue(Model.ReleaseID);
            model.Field(m => m.ItemType).DefaultValue(ReleaseNoteType.NewFeature);
            //defaultTranslationsList is a List<TranslationModel> with two empty objects in it
            model.Field(m => m.ReleaseNoteTranslations).DefaultValue(defaultTranslationsList);
        })
        .PageSize(5)
        .Read(read => read.Action("GetNotes", "ReleaseNotes", new { releaseID = Model.ReleaseID }))
        .Create(create => create.Action("AddNote", "ReleaseNotes"))
        .Update(update => update.Action("EditNote", "ReleaseNotes"))
        .Destroy(destroy => destroy.Action("DeleteNote", "ReleaseNotes"))
    )
)

因此,更具体地说,我遇到的问题是在控制器操作中:

public async Task<ActionResult> EditNote(ReleaseNotesModel model)

model.ReleaseNoteTranslations始终包含两个空对象(属性为null或0),即我为此属性设置的默认值。如果未设置默认值,则在弹出编辑器中将没有任何字段可为此属性进行编辑。所有其他属性将按预期方式更新。

让我感到烦恼的是,如果我使用服务器绑定而不是AJAX,那么所有数据都会被正确接收。因此,我决定在两种情况下都检查发送的请求标头中的数据:

// Using server binding
ReleaseID:300
NoteID:886
ItemType:1
ReleaseNoteTranslations[0].ItemID:886
ReleaseNoteTranslations[0].LanguageID:1
ReleaseNoteTranslations[0].TranslationID:869
ReleaseNoteTranslations[0].Translation:The module is now released!
ReleaseNoteTranslations[1].ItemID:886
ReleaseNoteTranslations[1].LanguageID:2
ReleaseNoteTranslations[1].TranslationID:870
ReleaseNoteTranslations[1].Translation:Le module est maintenant disponible!
NoteID:886

// Using AJAX binding
sort:
group:
filter:
NoteID:886
ReleaseID:300
ReleaseNoteTranslations[0][TranslationID]:869
ReleaseNoteTranslations[0][Translation]:The module is now released!
ReleaseNoteTranslations[0][LanguageID]:1
ReleaseNoteTranslations[0][ItemID]:886
ReleaseNoteTranslations[1][TranslationID]:870
ReleaseNoteTranslations[1][Translation]:Le module est maintenant disponible!
ReleaseNoteTranslations[1][LanguageID]:2
ReleaseNoteTranslations[1][ItemID]:886
ItemType:1

现在我首先注意到的是objectName[index].PropertyNamevs的语法objectName[index][PropertyName]

我想知道这是否可能是我的问题的原因,如果是,我是否有办法直接处理发送的数据以对其进行修复?这可能是Kendo Grid通过Ajax绑定发送数据的方式中的错误吗?

无论哪种方式,任何帮助将不胜感激!

阿列霍

因此,以防万一将来有人迷路,我联系了Telerik支持人员,后者向我解释说:

dataSource仅支持值类型,并且不会以模型绑定程序期望的格式序列化数组。

他们还为我提供了一种解决方法,即使用request Data函数来调用JavaScript函数,该JavaScript函数会将数据转换为正确的格式。

在视图中,通过指定要调用的JavaScript函数的名称来修改请求函数:

.Create(create => create.Action("AddNote", "ReleaseNotes").Data("serialize"))

然后添加将执行转换的函数:

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];
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Kendo Grid无法正确更新显示

来自分类Dev

模型绑定未正确更新

来自分类Dev

使用ngResource模块时,我的模型无法正确更新

来自分类Dev

创建后,Kendo Grid不会使用新创建的ID更新网格

来自分类Dev

更新属性后保存模型

来自分类Dev

更新到 Ubuntu 20.04 后无法正确键入使用 AltGr

来自分类Dev

使用Ajax更新Kendo Grid

来自分类Dev

使用绑定时更新当前模型值

来自分类Dev

角度绑定无法正确更新

来自分类Dev

角度绑定无法正确更新

来自分类Dev

使用模板无法在模型中更新模型

来自分类Dev

更新后刷新Telerik Kendo Grid(MVC)

来自分类Dev

更新后如何自动刷新Kendo Grid

来自分类Dev

更新后如何自动刷新Kendo Grid

来自分类Dev

ng-grid-csv-export 插件在数据更新后没有导出正确的数据

来自分类Dev

具有形式的模型绑定:IEnumerable <ModelName>与IEnumerable <Object>

来自分类Dev

使用Android Studio更新2.2.0更新gradle 2.2后无法创建apk

来自分类Dev

无法通过使用 ajax 更新的视图和局部视图创建模型

来自分类Dev

无法使用jQuery正确更新属性

来自分类Dev

更新后无法使用cocoapods

来自分类Dev

更新后耳机无法使用

来自分类Dev

ViewModel使用Ajax更新,模型未绑定

来自分类Dev

创建后Kendo网格不更新ID

来自分类Dev

为什么 Ajax 没有正确更新模型?

来自分类Dev

猫鼬,无法使用for循环更新模型

来自分类Dev

无法使用Django更新模型的数据

来自分类Dev

Ruby Sequel模型具有对创建和未更新的验证

来自分类Dev

Ruby Sequel模型具有对创建和未更新的验证

来自分类Dev

Laravel 创建和更新具有对外关系的模型