我有一个页面(表单),上面有很多用户控件,我试图用一个按钮来保存所有内容。UserControls 实际上是嵌套的,所以我想以某种方式向每个 UC 发出信号,告知它应该保存自己,而不是以某种方式将所有内容包装到一个事件中或让单个事件触发一连串的保存事件。
我的计划是使用一个静态类(这个答案的代码的道具):
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;
}
}
}
理想情况下,我的 MasterPage 上的按钮将设置 RequestScopedFormData.FormIsSaving = true,并且当 .NET 构建页面及其用户控件时,他们会知道自己执行保存。
我遇到的问题是我无法在页面生命周期中足够早地触发事件以保存用户控件。即使我将保存代码移动到 PreRender 事件,并将保存 ImageButton 移动到页面本身(而不是 MasterPage),我也无法在 UC 保存检查之前将 FormIsSaving 设置为 true。
它发生这样的事情:
- 页面 Page_Load
- MasterPage Page_Load
- UC Page_Loads 和 PreRenders(它们是混合的,它会在加载其他之前预渲染一些)
- MasterPage SaveButton_Click 事件(这是我设置类变量的地方)
- MasterPage 预渲染
- 页面预渲染
所以不幸的是,SaveButton_Click 方法发生在加载 UC 之后,所以它们永远不会保存。