2013-07-05 14 views
6

Mam problem z nieprawidłową aktualizacją właściwości mojego modelu podczas wysyłania do kontrolera w celu aktualizacji lub utworzenia połączenia z siatki Kendo. Model wygląda następująco:Model siatki Kendo z właściwością IEnumerable niepoprawną aktualizacją po utworzeniu/aktualizacji podczas używania wiązania 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; } 
} 

Oto siatki moim zdaniem:

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

Tak dokładniej, problem mam jest to, że w mojej działania kontrolera:

public async Task<ActionResult> EditNote(ReleaseNotesModel model) 

model.ReleaseNoteTranslations zawsze zawiera dwa puste obiekty (właściwości są zerowe lub 0), tj. Domyślną wartość ustawioną dla tej właściwości. Jeśli nie ustawię wartości domyślnej, nie będę miał żadnych pól do edycji dla tej właściwości w edytorze podręcznym. Wszystkie pozostałe właściwości są aktualizowane zgodnie z oczekiwaniami.

To, co robię, polega na tym, że jeśli używam wiązania serwera zamiast AJAX, wszystkie dane zostaną poprawnie odebrane. Więc postanowiłem sprawdzić dane w nagłówku żądania wysyłane w obu przypadkach:

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

Teraz co zauważam pierwsze tu jest składnia objectName[index].PropertyName vs objectName[index][PropertyName]

Zastanawiam się, czy to może być przyczyną mojego problemu, a jeśli tak, czy istnieje sposób, aby przejść i bezpośrednio manipulować przesyłanymi danymi, aby je naprawić? Czy może to być błąd w sposobie, w jaki Kendo Grid wysyła dane przez wiązanie Ajax?

Tak czy inaczej, każda pomoc będzie bardzo cenna!

+0

Byłaś w stanie stworzyć inną siatkę wewnątrz edytor podręczny? i zapisać wszystkie 'TranslationModel' razem z' ReleaseNotesModel' na raz? Mam problem, aby to zrobić. – Akbari

+1

Właściwie wyświetlałem tylko listę elementów textarea w edytorze wyskakującym, nigdy nie próbowałem robić tego z siatką. – Alejo

Odpowiedz

13

Więc jeżeli ktoś potknie się o tym w przyszłości, skontaktowałem wsparcie Telerik, który wyjaśnił mi, że:

DataSource obsługuje typy jedynie wartość i nie będzie serializować tablice w formacie, który jest oczekiwane przez model spoiwa.

Udostępniono mi również obejście funkcji żądania danych w celu wywołania funkcji JavaScript, która konwertuje dane na prawidłowy format.

W widoku, modyfikować funkcje żądanie określając nazwę funkcji JavaScript zadzwonić:

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

a następnie dodać w funkcjach, które zrobi konwersję:

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

Dziękuję bardzo. Szukałem odpowiedzi przez cały dzień. To było to. – user906573

+0

Mam jeszcze jeden obiekt wewnętrzny w moim obiekcie danych. Jak mogę zastosować do mojej siatki? –

0

Innym Problemem może być to, że kendo.aspnet.mvc.js nie jest zawarty w projekcie. Wygląda na to, że robi sztuczkę serializacyjną, gdy jest dołączona.

+0

Właściwie to ten skrypt zawierał cały czas, tylko dodanie ręcznej serializacji rozwiązało problem. – Alejo

0

Coś, co zauważyłem jest to, że trzeba dodać jeśli warunku nie trzeba do serializacji jeśli liczba wynosi 1, tylko jedna pozycja działa dobrze bez serializacji

Powiązane problemy