在Page_PreInit和Page_Load之间传递对象/变量

时间:2009-07-23 18:46:35

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

我使用数据库动态构建页面来存储页面信息和.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请求之后就会消失吗?

感谢您的帮助! 饲料

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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