【问题标题】:How to share variable between all methods in code behind?如何在代码后面的所有方法之间共享变量?
【发布时间】:2013-04-23 23:47:11
【问题描述】:

我正在尝试修复一个真正糟糕的 ASP.net 4.0 程序交给我。编写它的人没有使用正常的 asp.net 标准。我本人对 ASP.net 还很陌生,并尽可能地尝试了解更多有关它的信息。无论如何,它是一个带有 C# 代码的 ASP.Net 4.0 webforms 应用程序。

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

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

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

  3. 然后我认为回发可能是导致值消失的原因,因此我在 detailById 方法中将 Username 值存储在 ViewState 变量中。当我尝试访问此变量时,它也为空。我不知道为什么。

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

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

我希望我的问题说清楚了。谢谢。

【问题讨论】:

    标签: asp.net c#-4.0 webforms


    【解决方案1】:

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

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

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

    【讨论】:

    • 您的 cmets 非常有帮助,而且完全符合要求。在你提到它之前我不知道这个信息。我使用 session 将它存储在我正在修复的版本中。最近我重写了它,一旦我将代码移动到 Page_load 事件,就能够正确使用 Viewstate。谢谢!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-05-15
      • 2023-03-17
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 2021-11-04
      • 2014-08-29
      相关资源
      最近更新 更多