I have a Page (form) that has many UserControls on it, and I’m trying to have a single button to save everything. The UserControls are actually nested, so I wanted to somehow signal to each UC that it should save itself, instead of somehow wrapping everything into one event or having a single event trigger a cascade of save events.
My plan was to use a static class (props to this answer for the code):
public static class RequestScopedFormData { private const string save_key = 'request_form_is_saving'; public static bool FormIsSaving { get { object o = HttpContext.Current.Items[save_key]; return Convert.ToBoolean(o); } set { HttpContext.Current.Items[save_key] = value; } } }
Ideally a button on my MasterPage would set RequestScopedFormData.FormIsSaving = true, and as .NET builds the Page and its UserControls, they would know to perform a save on themselves.
The problem I’m having is that I can’t get an event to fire early enough in the Page lifecycle to save the UserControls. Even if I move the saving code to the PreRender event, and I move the save ImageButton to the Page itself (instead of the MasterPage), I cannot get the FormIsSaving set to true before the UC saving check.
It happens something like this:
- Page Page_Load
- MasterPage Page_Load
- UC Page_Loads and PreRenders (they are mixed, it prerenders some before it loads others)
- MasterPage SaveButton_Click event (this is where I set my class variable)
- MasterPage PreRender
- Page PreRender
So unfortunately the SaveButton_Click method happens AFTER the UCs are loaded, so they never save.
You can also check if postback was caused by the save button:
The form variables are available earlier in the page life cycle.