0

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

我的问题是如何将对象和变量从Page_PreInitto 传递给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_PreInit当使用该方法在和之间共享变量时,我似乎只会遇到那些编译错误Page_Load。换句话说,如果我只是从数据库中请求数据两次,一次在“Page_PreInit”中,一次在“Page_Load”中,我永远不会收到这些错误。但我真的不希望数据库负载加倍。

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

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

感谢您的任何帮助!饲料

4

4 回答 4

0

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

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

于 2009-07-23T18:53:30.727 回答
0

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

于 2009-07-23T18:49:51.560 回答
0

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

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

于 2009-07-23T18:49:52.340 回答
0

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

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

于 2009-07-23T18:50:02.590 回答