Ich habe nur mit diesem Problem zu tun. Wie sich herausstellt, hat the code for TryUpdateModel
nichts falsch daran, aber es hängt völlig davon ab, was die ValueProvider
gibt.
Was AJAX (mein Fall auch), ist es wirklich wahrscheinlich, dass die JsonValueProviderFactory
das ist die Antwort und gibt Werte an den Controller Parsen, die die TryUpdateModel
Methode führt, die nie, wo diese Werte erfahren. Da TryUpdateModel
das Zielmodell nur basierend auf den vom Wertanbieter bereitgestellten Eigenschaften aktualisiert, werden die geleerten Sammlungen nicht berührt, da diese Eigenschaften vom Anbieter überhaupt nicht gesendet werden.
Der Code, der dies ermöglicht, ist this line in JsonValueProviderFactory
, wobei ein Array der Größe Null niemals einen Wert erhält, der dem Hintergrundspeicher hinzugefügt wird, wodurch die Eigenschaft "dissapear" wird.
Ich habe einen Bericht für diesen Fehler in der ASP.NET-Codeplex-Site (Json Request with empty array) von Januar 2012 gefunden, und Wallymathieu (der Übergeber) hat einen Patch zur Verfügung gestellt, der dafür sorgen wird. Dies ist der relevante Teil des Pflasters:
//BEGIN CHANGE
if (l.Count == 0) {
AddToBackingStore(backingStore, prefix, null);
}
else for (int i = 0; i < l.Count; i++) {
//END CHANGE
Was er tut, richtig ist es die Eigenschaft, mit einem Nullwert addiert, wenn das Feld als leer gesendet wird.
Sie können Ihre eigenen ValueProviderFactory
mit dem Code zu machen, die genau dort ausgesetzt sind und es durch diese Weise in Ihrer Global.asax
Datei, Application_Start
Methode bis zu Ihrer Anwendung Haken:
ValueProviderFactories.Factories.Remove(ValueProviderFactories.Factories.OfType<JsonValueProviderFactory>().FirstOrDefault());
ValueProviderFactories.Factories.Add(new YourOwnJsonValueProviderFactory());
Das hat mein Problem zu lösen, ich hoffe, es tut es auch für Sie und die Zukunft TryUpdateModel'ers.
Wenn die Sammlung Elemente über Ajax entfernt werden, warum würde TryUpdateModel alles tun (in Bezug auf die Sammlung)? Was bleibt zu klären? –
Ja, ich füge Objekte über AJAX hinzu oder entferne sie mithilfe einer Teilansicht, die die Liste mit dem entfernten Objekt wiedergibt oder ein neues Objekt hinzufügt. Aber ich spare keine Änderungen zu diesem Zeitpunkt, sondern aktualisiere nur die Ansicht mit dem Objekt entfernt/hinzugefügt. Dann klicke ich auf meinen Speichern-Knopf, es postet alles zurück und speichert dann in meinem DB den gesamten Objektgraphen. – Vincent