【问题标题】:Event not firing early enough in .NET Page cycle事件在 .NET 页面周期中没有足够早地触发
【发布时间】:2009-03-31 22:46:40
【问题描述】:

我有一个页面(表单),上面有很多用户控件,我试图用一个按钮来保存所有内容。 UserControls 实际上是嵌套的,所以我想以某种方式向每个 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 构建页面及其用户控件时,他们会知道自己执行保存。

我遇到的问题是我无法在页面生命周期中足够早地触发事件以保存用户控件。即使我将保存代码移动到 PreRender 事件,并将保存 ImageButton 移动到页面本身(而不是 MasterPage),我也无法在 UC 保存检查之前将 FormIsSaving 设置为 true。

会发生这样的事情:

  • 页面Page_Load
  • MasterPage Page_Load
  • UC Page_Loads 和 PreRenders(它们 是混合的,它会在之前预渲染一些 它会加载其他人)
  • MasterPage SaveButton_Click 事件 (这是我设置课程的地方 变量)
  • MasterPage 预渲染
  • 页面预渲染

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

【问题讨论】:

    标签: .net user-controls page-lifecycle


    【解决方案1】:

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

    【讨论】:

    • 对您需要的事件发表评论,我将修改答案,使其包含所有信息。
    • 问题是我似乎无法在 UC Page_Loads 之前设置该变量。如果我使用 ImageButton 事件来设置它,它会出现在所有 UC Page_Loads(和 PreRenders)之后。有没有办法知道哪个方法/事件导致了请求/响应?
    • 虽然你不想这样做,但事件级联可能是最好的方法,它是有道理的,即使写起来很痛苦
    • 硬道理。好吧,我想我需要咬紧牙关。非常感谢您的帮助。
    【解决方案2】:

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

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

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

    【讨论】:

    • 这绝对是我一直在寻找的...除了我的 __EVENTTARGET 似乎是空白的。如果我使用 ck 的 Trace=true 建议,我在请求中的任何地方都看不到 UniqueID。
    • 显然按钮没有设置 __EVENTTARGET。 ryanfarley.com/blog/archive/2005/03/11/1886.aspx 寻求解决方法。
    【解决方案3】:

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

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

    例如

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

    【讨论】:

    • 不确定这是否可行,但这是个好主意 - 再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    相关资源
    最近更新 更多