事件在.NET页面循环中没有及早触发

时间:2009-03-31 13:42:16

标签: .net user-controls page-lifecycle

我有一个页面(表单)上有许多UserControl,我正在尝试使用一个按钮来保存所有内容。 UserControl实际上是嵌套的,所以我想以某种方式向每个UC发出信号,告知它应该保存自己,而不是以某种方式将所有内容包装成一个事件或者让一个事件触发一连串的保存事件。

我的计划是使用静态类(代码为this answer的道具):

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构建Page及其UserControl时,他们会知道自己执行保存。

我遇到的问题是我无法在页面生命周期中尽早启动事件来保存UserControls。即使我将保存代码移动到PreRender事件,并将保存ImageButton移动到Page本身(而不是MasterPage),我也无法在UC保存检查之前将FormIsSaving设置为true。

它发生的事情是这样的:

  • Page Page_Load
  • MasterPage Page_Load
  • UC Page_Loads和PreRenders(他们 它们混合在一起,它之前有些预先渲染 加载其他人)
  • MasterPage SaveButton_Click事件 (这是我上课的地方 变量)
  • MasterPage PreRender
  • Page PreRender

所以不幸的是,SaveButton_Click方法在加载UC之后发生,因此它们永远不会保存。

3 个答案:

答案 0 :(得分:3)

将您的@Page指令包含在内,以包含Trace =“true” - 这将为您提供有关所调用内容的完整诊断,并允许您为所需的生命周期部分确定最佳方法。

答案 1 :(得分:1)

您还可以检查回发是否由保存按钮引起:

Request.Form["__EVENTTARGET"].Contains({YourSaveButton}.UniqueID)

表单变量在页面生命周期的早期可用。

答案 2 :(得分:0)

您的控件是否都来自同一个界面,还是可以为它们添加通用界面?

然后在您的保存按钮方法中,您可以遍历页面上的所有控件,然后对于与您的界面匹配的项目,请调用Save方法。

E.g。

foreach (Control cntrl in Page.Controls)
{
  if (cntrl is IMySavableControl)
  {
     cntrl.Save();
  }
}