2013-07-05 3 views
6

Ho un problema in cui una proprietà del mio modello non viene aggiornata correttamente quando viene inviata al mio controller per una chiamata di aggiornamento o di creazione da una griglia di Kendo. Il modello si presenta così:Modello Kendo Grid con una proprietà IEnumerable che non si aggiorna correttamente dopo la creazione/aggiornamento quando si utilizza il legame AJAX

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

Ecco la griglia a mio avviso:

@(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")) 
    ) 
) 

Quindi più specificamente, il problema che sto avendo è che nella mia azione di controllo:

public async Task<ActionResult> EditNote(ReleaseNotesModel model) 

model.ReleaseNoteTranslations contiene sempre due oggetti vuoti (le proprietà sono nulle o 0), ovvero il valore predefinito che ho impostato per questa proprietà. Se non imposto alcun valore predefinito, non avrò alcun campo da modificare per questa proprietà nell'editor popup. Tutte le altre proprietà vengono aggiornate come previsto.

Ciò che mi infastidisce è che se utilizzo il binding del server anziché AJAX, tutti i dati vengono ricevuti correttamente. Così ho deciso di controllare i dati nelle intestazioni di richiesta di essere inviato in entrambi i casi:

// 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 

Ora quello che ho notato prima qui è la sintassi di objectName[index].PropertyName vs objectName[index][PropertyName]

Mi chiedo se questo potrebbe essere la causa del mio problema, e se è così, c'è un modo per me di andare direttamente a manipolare i dati inviati per risolverlo? Potrebbe essere un bug nel modo in cui Kendo Grid invia i dati tramite l'associazione Ajax?

In entrambi i casi, qualsiasi aiuto sarebbe molto apprezzato!

+0

Sei stato in grado di creare un'altra griglia all'interno l'editor popup? e salva tutti i 'TranslationModel' insieme a' ReleaseNotesModel' in una volta? Sto avendo problemi a farlo. – Akbari

+1

In realtà ho visualizzato solo un elenco di elementi textarea nell'editor popup, non ho mai provato a farlo con una griglia. – Alejo

risposta

13

Così Nel caso qualcuno inciampa su questo in futuro, ho contattato il supporto Telerik, che mi ha spiegato che:

il DataSource supporta i tipi di unico valore e non serializzare i array nel formato che è atteso dal legatore del modello.

Inoltre, mi hanno fornito una soluzione alternativa utilizzando la funzione Dati richiesta per chiamare una funzione JavaScript che converte i dati nel formato corretto.

Nella vista, modificare le funzioni di richiesta specificando il nome della funzione javascript per chiamare:

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

E poi aggiungere le funzioni che faranno la conversione:

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

Grazie mille. Ho cercato una risposta per tutto il giorno. Era così. – user906573

+0

Ho un altro oggetto interno nel mio oggetto dati .. come posso applicare alla mia griglia? –

0

altro il problema potrebbe essere che kendo.aspnet.mvc.js non è incluso nel progetto. Sembra fare il trucco di serializzazione quando incluso.

+0

In realtà avevo incluso lo script per tutto il tempo, solo l'aggiunta della serializzazione manuale risolveva il problema per me. – Alejo

0

Qualcosa che ho notato è che è necessario aggiungere se la condizione come non è necessario per serializzare se il conteggio è 1, un solo elemento funziona bene senza serializzazione

Problemi correlati