Laden...

ObjectDataSource: Teil-Update/aktuellen Zustand laden vor Update

Erstellt von VizOne vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.238 Views
VizOne Themenstarter:in
1.373 Beiträge seit 2004
vor 18 Jahren
ObjectDataSource: Teil-Update/aktuellen Zustand laden vor Update

Hallo!

Ich habe folgendes Problem: Ich habe ein Formular (FormView), dessen DataSource ein ObjectDataSource für ein bestimmtes Business Objekt (BO) ist. Mit Hilfe der Form sollen einige (aber nicht alle) Eigenschaften des Objekts verändert werden. Das Anzeigen der Daten für ein bestehendes BO ist, auch kein Problem, allerdings ergibt sich eine ungünstige Situation, wenn ich das Objekt Updaten möchte: es wird ein neues BO erstellt und die Felder, die in der Form gebunden sind werden auch korrekt gesetzt, allerdings natürlich nur diese Felder. Felder, die ich nicht in der Form habe, werden nicht gesetzt. Das BO, das daraufhin an die Update-Methode übergeben wird, ist darum nicht "vollständig". Da meine Update-Methode ein vollständig ausgefülltes Objekt erwartet, geht das natürlich schief.

Wie kann ich dafür sorgen, dass ASP.NET vor dem Update erst die aktuelle Version des BOs lädt (statt ein neues zu erstellen) und dann die Veränderung darauf anwendet und dieses BO an die Update-Methode zu schicken. Gibt es da eine einfache Lösung für? Oder muss ich ItemUpdating behandel und dort die fehlenden Werte selbst "nachladen". Letzteres würde technisch gesehen funktionieren, hier ein VB-Beispiel:


Protected Sub HandleFormViewUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.FormViewUpdateEventArgs) Handles _formView.ItemUpdating
        Dim obj As Cylinder = New Cylinders().GetCylinderByNumber(CInt(Request.QueryString("nr")))
        ' für jede les- und schreibbare Eigenschaft wird ein Eintrag in OldValues
        ' gemacht, falls dieser noch nicht besteht.
        For Each prop As Reflection.PropertyInfo In obj.GetType().GetProperties()
            If prop.CanWrite AndAlso prop.CanRead AndAlso Not e.OldValues.Contains(prop.Name) Then
                e.OldValues.Add(prop.Name, prop.GetValue(obj, Nothing))
            End If
        Next
    End Sub

Lieber wäre es mir, wenn es eine einfachere Möglichkeit gäbe! Vielen Dank für Eure Antworten.

Grüße,
Andre

P
123 Beiträge seit 2006
vor 18 Jahren

hmm,

ich würde sagen das du dein BO zwischenspeichern müsstet um später weiderherstellen zu können bzw. damit zu arbeiten.

Keine Ahnung wie umfangreich dein BO ist, aber du könntest es evtl. in enie Session oder ViewState speichern um beim erneuten Postback davon entnehmen.

Hast du evtl. schon überlegt das BO zu serialisieren (XML)?

Gruss plongo


Woher soll ich wissen, was ich denke, bevor ich höre, was ich sage!
Kurzum: Läufer sind gesünder, "gescheiter" und glücklicher als Nichtläufer.
www.andreas-nicole.de

VizOne Themenstarter:in
1.373 Beiträge seit 2004
vor 18 Jahren

Danke für deine Antwort. Naja, es ist nicht nötig, dass Objekt zwischenzuspeichern, ich kann mir das Objekt ja jederzeit "live" holen, entweder so, wie im Codebeispiel oben oder über _objectDataSource.Select().

Ich hab mir einfach zwei Helferlein geschrieben:


public static void ExtractProperties(object obj, IDictionary dictionary) {
	foreach(PropertyInfo prop in obj.GetType().GetProperties()) {
		if (prop.CanWrite && prop.CanRead && !dictionary.Contains(prop.Name)){
			dictionary.Add(prop.Name, prop.GetValue(obj, null);
		}
	}
}

public static object GetFirst(IEnumerable enumerable) {
	IEnumerator enumerator = enumerable.GetEnumerator();
	if(enumerator.MoveNext()) {
		return enumerator.Current;
	} else {
		return null;
	}
}

... und fülle so die OldValues an:


protected void HandleFormViewUpdating(object sender, FormViewUpdateEventArgs e) {
	Helper.ExtractProperties(Helper.GetFirst(_objectDataSource.Select()), e.OldValues);
}

Funktioniert fürs erste, ist aber nicht so der Knaller. Mein eigentliches Problem besteht darin, dass ich nicht weiß, ob es keine einfachere Möglichkeit gibt dafür zu sorgen, dass das BO komplett gefüllt wird, teils aus bestehenden Daten, teils aus den veränderten in der Form.

Grüße,
Andre

C
1.215 Beiträge seit 2004
vor 18 Jahren

Das wirst Du leider weiterhin händisch erledigen müssen, da ASP.NET keine Funktionalitäten für solche Vorgänge vorsieht.
Dazu müsste es die Möglichkeit geben, ein Form direkt an einen Objekttyp zu binden, wenn die geänderten Eigenschaften automatisch erkannt werden sollen.

Aber es wäre mal eine interessante und sicher produktive Ergänzung, hierfür Funktionalitäten zu entwickeln, die universell einsetzbar sind. Problematisch wäre dabei allerdings sicher die Überprüfung der einzelnen Feldinhalte auf Richtigkeit, sofern dies auch automatisch geschehen sollte. Ansonsten müsste man hier wieder händisch per Validatoren oder manueller Überprüfung nacharbeiten.

Grüsse
Cord