Kendo-Grid-Modell mit einem IEnumerable-Eigenschaft nicht richtig aktualisiert-nach dem Erstellen/Aktualisieren bei der Verwendung von AJAX-Bindung
Ich habe da ein problem, wo eine Eigenschaft von mein Modell wird nicht korrekt aktualisiert, wenn Sie senden Sie es an meinem controller, für einen Update-oder Create-Aufruf von einem Kendo-Raster. Das Modell sieht wie folgt aus:
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; }
}
Hier ist das raster, in meiner Ansicht:
@(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"))
)
)
Also konkret ist das problem, das ich habe ist, dass in meine controller-action:
public async Task<ActionResult> EditNote(ReleaseNotesModel model)
model.ReleaseNoteTranslations
enthält immer zwei leere Objekte (Eigenschaften null sind oder 0), D. H. der default-Wert, die ich für diese Eigenschaft. Wenn ich keinen default-Wert, dann will ich Sie nicht alle Felder Bearbeiten, die für diese Eigenschaft in der popup-editor. Alle anderen Eigenschaften sind wie erwartet aktualisiert.
Was mich nervt ist, dass wenn ich mit server-Bindung anstelle von AJAX, dann alle Daten korrekt empfangen werden. Also beschloss ich, check out die Daten in den request-Header gesendet wird, in beiden Fällen:
//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
Nun, was ich merke, die erste ist hier die syntax von objectName[index].PropertyName
vs objectName[index][PropertyName]
Ich Frage mich, ob dies könnte die Ursache für mein problem, und wenn ja, gibt es eine Möglichkeit für mich zu gehen, und direkt die Daten Bearbeiten, die gesendet wird, um es zu beheben? Könnte das ein bug in den Weg, Kendo-Netz sendet Daten über Ajax verbindlich?
Entweder Weg, jede Hilfe wäre sehr geschätzt werden!
- Sie habe in der Lage zu schaffen, ein anderes raster innerhalb der popup-editor? und speichern Sie alle die
TranslationModel
zusammen mit derReleaseNotesModel
auf einmal? Ich bin mit problem zu tun. - Eigentlich habe ich nur angezeigt, eine Liste von textarea-Elemente in den popup-editor, ich habe nie versucht, es zu tun mit einem Gitter.
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, In Fall, dass jemand stolpert auf diese in die Zukunft, die ich kontaktiert Telerik Unterstützung, die mir erklärt, dass:
Sie mich ebenfalls mit einem workaround über die Anfrage-Daten-Funktion zum aufrufen einer JavaScript-Funktion, die konvertiert die Daten in das richtige format.
In der Ansicht, ändern Sie die Anfrage-Funktionen, indem Sie den Namen der JavaScript-Funktion aufrufen:
Und fügen Sie dann in den Funktionen, die die Konvertierung:
Weiteres Problem könnte sein, dass die kendo.aspnet.mvc.js ist nicht im Projekt enthalten. Es zu tun scheint, ist die Serialisierung trick, wenn enthalten.
Etwas, dass mir aufgefallen ist, dass Sie brauchen, um hinzuzufügen, wenn die Bedingung wie Sie nicht brauchen, zu serialisieren, wenn die Anzahl 1 ist, nur ein Element, funktioniert einwandfrei, ohne Serialisierung