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