0

我有一个页面(表单),上面有很多用户控件,我试图用一个按钮来保存所有内容。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 之后,所以它们永远不会保存。

4

3 回答 3

3

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

于 2009-03-31T13:44:02.217 回答
1

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

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

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

于 2009-03-31T14:46:40.210 回答
0

你的控件都是从同一个接口派生的,还是你可以给它们添加一个通用接口?

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

例如

foreach (Control cntrl in Page.Controls)
{
  if (cntrl is IMySavableControl)
  {
     cntrl.Save();
  }
}
于 2009-03-31T14:20:34.483 回答