2012-04-06 6 views
0

Ich arbeite mit asp.net mvc 3 und Probleme mit der Verwendung von tryUpdateModel beim Posten von Änderungen.TryUpdateModel entleert keine Sammlung von Elementen, wenn alle Elemente auf dem Bildschirm entfernt werden

Ich habe ein Modell, das mehrere Listen von Elementen enthält und meine Ansicht kann Elemente von Ajax hinzufügen oder entfernen und ich kann Änderungen mit einer Schaltfläche speichern speichern.

Wenn ich Elemente zu den Sammlungen hinzufüge, funktioniert TryUpdateModel einwandfrei, aber wenn ich ALLE Elemente in einer Sammlung lösche, wird diese Sammlung nicht mehr in Formularwerten abgelegt und TryUpdateModel tut nichts, anstatt meine Sammlung zu löschen.

Wie kann ich mit diesem Szenario umgehen? Hat jemand einen Workaround gefunden? Muss ich den DefaultModelBinder überschreiben?

Dank

+0

Wenn die Sammlung Elemente über Ajax entfernt werden, warum würde TryUpdateModel alles tun (in Bezug auf die Sammlung)? Was bleibt zu klären? –

+0

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

Antwort

1

Nun, ich weiß nicht, warum es nicht die Sammlung nicht klar, aber eine Abhilfe könnte, wenn die entsprechenden Formularwerte nur zu erkennen sein fehlen, und manuell die Elemente zu entfernen. Etwas wie:

public ActionResult Edit(SomeEntity obj) 
{ 
    if(Request.Form["expectedFormValue"] == null) 
    { 
     obj.YourCollection.Clear(); 
    } 
    TryUpdateModel(obj); 
} 
+0

In meinem Fall habe ich viele Listen in einem Objektdiagramm, wenn ich es vermeiden kann zu testen, ob jede Sammlung nicht leer ist, wird es großartig. Wenn ich keine anderen Lösungen habe, werde ich für Ihren Trick gehen. Danke – Vincent

0

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.

Verwandte Themen