0

我正在尝试修复一个真正糟糕的 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. 然后我认为回发可能是导致值消失的原因,因此我将 Username 值存储在 ViewState 变量中,而在 detailById 方法中。当我尝试访问此变量时,它也为空。我不知道为什么。

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

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

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

4

2 回答 2

0

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

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

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

更重要的是,您必须getDetailByIdPage_Load. 因为,aspx 页面上的嵌入代码在渲染阶段被调用,在此之前ViewState已经保存(检查这里)。如果无法将该代码移动到 中Page_LoadSession则留 (#4) 来完成这项工作。

于 2013-04-24T01:06:25.890 回答
0

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

于 2013-04-24T06:40:47.463 回答