我遇到的问题是,当我将模型的属性发送到我的控制器以获取来自Kendo Grid的更新或创建调用时,其属性未正确更新.该模型如下所示:
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]的语法.PropertyName vs objectName [index] [PropertyName]
我想知道这是否可能是我的问题的原因,如果是这样,有没有办法让我直接操纵发送的数据来修复它?这可能是Kendo Grid通过Ajax绑定发送数据的方式中的错误吗?
无论哪种方式,任何帮助将不胜感激!
解决方法
因此,如果有人在将来发现这一点,我联系了Telerik支持,他向我解释说:
The dataSource supports only value types and will not serialize the
arrays in the format that is expected by the model binder.
他们还为我提供了一个解决方法,使用请求数据函数来调用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]; } } }