如何在代码中的所有方法之间共享变量?

时间:2013-04-23 23:47:11

标签: asp.net c#-4.0 webforms

我正在尝试修复一个真正糟糕的ASP.net 4.0程序交给我。编写它的人没有使用正常的asp.net标准。我自己是ASP.net的新手,并试图在任何可能的情况下更多地了解它。无论如何,它是一个ASP.Net 4.0 webforms应用程序,后面有C#代码。

我正在处理一个页面,它在标记本身中调用了一个代码隐藏方法。我们可以调用这个方法获取detailById。此方法调用Web服务,该服务使用此id查询数据库并将数据集返回给后面的代码。收到所有这些数据后,它将被写入表格中的屏幕。就是这种方法。在该页面的底部存在各种功能不同的按钮。让我们拿一个名为Hello的按钮,例如。所有这个按钮所要做的就是访问detailById方法中获得的字段之一(例如:Username)。 如何让这个变量值可用于方法背后的所有代码?我考虑了以下想法:

  1. 像detailById那样重新查询数据库以获取此字段,但这似乎非常低效。

  2. 为页面创建了一个类级变量,并将其值设置为detailById方法中的Username变量。这没用。当我点击“Hello”按钮时,缺少用户名。我知道它是在detialById方法中获得的。

  3. 然后我认为回发可能会导致值消失,所以我在detailById方法中将Username值存储在ViewState变量中。当我试图访问这个变量时,它也是null。我不明白为什么。

  4. 最后,我在detailById方法中将此值放在Session中。这很有效,价值可以在我的方法背后的各种代码中引用。这感觉就像是一种错误的方法。我是对的吗?

  5. 这样做的好/正确方法是什么?

    我希望我明白我的问题。谢谢。

2 个答案:

答案 0 :(得分:0)

我建议把它放在ViewState(#3)中。但您必须确保EnableViewState=True标记上有ViewStateMode=Enabled@Page(实际上这些是默认值)。我更喜欢使用属性来包装存储/检索工作,如:

private string UserName
{
    get
    {
        return ViewState["__userId"] as string;
    }

    set
    {
        ViewState["__userId"] = value;
    }
}

更重要的是,您必须从getDetailById调用Page_Load方法。因为,aspx页面上的嵌入代码在呈现阶段被调用,之前已经保存ViewStatecheck here)。如果无法将该代码移至Page_Load,则需要Session(#4)来完成工作。

答案 1 :(得分:0)

会话是一个很好的解决方案。 您可以使用sessionState mode="SQLServer"来提高会话性能和安全性。 参考:http://support.microsoft.com/kb/317604