I have adopted a technique where I pass existing objects to forms so that they can display the object’s content and allow the user to alter it if necessary. The form is not bound to the object, so when it comes time to act, the form sweeps up the content of its controls and puts them into the object. The object is then validated and any issues reported to the user. If the object is valid, it may be handed back to the caller so the caller can refresh a view/list/etc.
So far, so good. However, if the form’s content, or lack of, creates an invalid object and the user does not correct it, maybe cancelling the form, there’s a chance the form will hand an invalid object back to the caller. This is not good.
Essentially I’m looking for an elegant and efficient way of either leaving the object as it was or rolling back if the user cancels the form/action.
I have considered a range of techniques, each with many pros and cons. I’m keen to consider some other views.
In the past, I have solved this by making a shallow copy of the object when passing it out to your form. Then, when the copy comes back you validate it. If it checks out, you simply overwrite the original object with the copy.