【问题标题】:Pass objects/vars between Page_PreInit and Page_Load在 Page_PreInit 和 Page_Load 之间传递对象/变量
【发布时间】:2009-07-23 18:46:34
【问题描述】:

我正在使用数据库动态构建页面来存储页面信息,并使用 .NET (C#) 来构建页面。该过程的一部分是根据数据库中的内容设置母版页(在代码隐藏中),据我所知,这必须在Page_PreInit 中完成。

我的问题是如何将对象和变量从Page_PreInit 传递到Page_Load

我已经能够使其工作如下,但使用此方法时出现随机编译错误:

public partial class BuildPage : System.Web.UI.Page
{
    protected static string pageData;

    protected void Page_PreInit(object sender, EventArgs e)
    {
        --- SET pageData = DATA FROM DATABASE, AND SET MASTERPAGE ---
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        --- USE pageData TO BUILD AND DISPLAY THE REST OF THE PAGE ---
    }
}

由于各种原因,我没有使用 Visual Studio 来编译页面,只是让 .NET 在第一个页面请求时即时编译。我收到了两条错误消息:

1) “CS0102:‘BuildPage’类型已经包含‘pageData’的定义”

2) “ASPNET:确保此代码文件中定义的类与 'inherits' 属性匹配,并且它扩展了正确的基类(例如 Page 或 UserControl)。”

奇怪的是,有时页面会在第一个 Web 请求时编译。并且,对于那些在第一次请求时没有出现的情况,在随机数次页面刷新后,它会完美编译。编译后一切似乎都可以正常工作,直到我对后面的代码进行另一次更改并且它必须重新编译。

我似乎只在使用该方法在Page_PreInitPage_Load 之间共享变量时遇到那些编译错误。换句话说,如果我只是从数据库中请求数据两次,一次在“Page_PreInit”中,一次在“Page_Load”中,我永远不会收到这些错误。但我真的不希望数据库负载翻倍。

所以我的问题实际上有两个部分,首先,这是一种可以接受的共享变量的方式,还是有更好的方式将数据从Page_PreInit 传递到Page_Load

其次,如果这是一种可以接受的方式,这些错误是否不相关?是否有人见过类似的错误在重复的 Web 请求之后就消失了?

感谢您的任何帮助! 饲料

【问题讨论】:

  • 您是否总是使用相同的数据进行测试? IE。当您尝试在 PageLoad 中访问它时,有时 pageData 是否为 null,因为数据库中缺少某些内容?
  • 感谢大家的帮助,你们都有可靠的答案,问题出在“静态”修饰符上。 StackOverflow.Com 很棒。

标签: c# .net compiler-construction webpage code-behind


【解决方案1】:

使用受保护(或私有)成员绝对是在类中的方法之间共享对象的正确方法。但是,您的会员不应staticStatic 表示跨多个线程有一个实例。为访问该页面的不同请求而执行的每个页面副本都在竞争读取/写入该成员。

此外,您的课程被标记为“部分”。这意味着另一个文件中可能有另一个类片段,它具有相同BuildPage 类的其他成员和方法。如果在两者中声明相同的pageData 成员,它们就会发生冲突。

【讨论】:

  • 啊,非常感谢,“静态”修饰符正是问题所在。我很确定“部分”类是正确的(msdn.microsoft.com/en-us/library/system.web.ui.page.aspx),但我肯定也会对此进行更多调查。感谢您快速而完整的回复!
  • @fodder 太棒了!需要明确的是 - “部分”不一定有错 - 只是要记住,当某些东西被标记为“部分”时,可能在其他地方有重复的成员声明。
【解决方案2】:

您很可能不希望成员变量是静态的。如果多人同时访问该页面,可能会产生奇怪的结果。
由于模板的工作方式,这也可能是您的问题的直接原因,尽管我不确定。

【讨论】:

    【解决方案3】:

    在您的代码隐藏中,您是否有多个页面的类指定为 BuildPage?它们对于每个页面应该是唯一的,并且在关联的 .aspx 的页面指令中正确引用。我认为 CS0102 错误是因为您有两个同名的部分类,它们都定义了一个静态值。因此,当两个部分组合在一起时,您尝试在组合类中定义静态两次。如果你整理好你的类名/页面指令,那也应该解决第二个错误。

    其次,pageData 变量没有理由是静态的。您将能够设置和访问该值而不是静态的。

    【讨论】:

      【解决方案4】:

      静态不会是您想要的 - 它由页面的所有实例共享,因此如果两个客户端正在加载相同的页面,第二个将覆盖第一个,并有可能在 init 和加载第一个。

      您可以使用页面的 HttpContext 来传递数据,它会流经所有事件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-23
        • 2011-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-03
        相关资源
        最近更新 更多