2013-07-05 25 views
6

我遇到问题,在将模型的属性发送给我的控制器以进行更新或创建调用时,我的模型属性没有正确更新来自Kendo Grid。该模型是这样的:使用AJAX绑定创建/更新后,IEnumerable属性无法正确更新的Kendo网格模型

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绑定发送数据的方式中的一个错误吗?

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

+0

你已经能够里面创建另一个格子,如果条件增加弹出式编辑器?并一次保存所有'TranslationModel'和'ReleaseNotesModel'?我有问题要这样做。 – Akbari

+1

其实我只在弹出的编辑器中显示textarea元素的列表,我从来没有尝试过用网格来做。 – Alejo

回答

13

所以,如果有人在此跌倒在未来,我接触Telerik的支持,谁向我解释说:

数据源仅支持值类型,并且将不序列在作为格式 阵列由模型绑定器预计。

他们还为我提供了一种解决方法,使用请求Data函数调用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]; 
     } 
    } 
} 
+0

非常感谢。我一直在寻找答案。就是这样。 – user906573

+0

我在数据对象中有一个内部对象..我如何应用到我的网格? –

0

另一个问题可能是kendo.aspnet.mvc.js未包含在项目中。它包含了序列化技巧。

+0

我实际上已经包含了整个脚本,只添加手动序列化为我解决了这个问题。 – Alejo

0

东西,我注意到的是,你需要为你不需要序列化如果计数为1,只有一个项目工作正常,没有系列化

相关问题