我正在尝试修复一个真正糟糕的ASP.net 4.0程序交给我。编写它的人没有使用正常的asp.net标准。我自己是ASP.net的新手,并试图在任何可能的情况下更多地了解它。无论如何,它是一个ASP.Net 4.0 webforms应用程序,后面有C#代码。
我正在处理一个页面,它在标记本身中调用了一个代码隐藏方法。我们可以调用这个方法获取detailById。此方法调用Web服务,该服务使用此id查询数据库并将数据集返回给后面的代码。收到所有这些数据后,它将被写入表格中的屏幕。就是这种方法。在该页面的底部存在各种功能不同的按钮。让我们拿一个名为Hello的按钮,例如。所有这个按钮所要做的就是访问detailById方法中获得的字段之一(例如:Username)。 如何让这个变量值可用于方法背后的所有代码?我考虑了以下想法:
像detailById那样重新查询数据库以获取此字段,但这似乎非常低效。
为页面创建了一个类级变量,并将其值设置为detailById方法中的Username变量。这没用。当我点击“Hello”按钮时,缺少用户名。我知道它是在detialById方法中获得的。
然后我认为回发可能会导致值消失,所以我在detailById方法中将Username值存储在ViewState变量中。当我试图访问这个变量时,它也是null。我不明白为什么。
最后,我在detailById方法中将此值放在Session中。这很有效,价值可以在我的方法背后的各种代码中引用。这感觉就像是一种错误的方法。我是对的吗?
这样做的好/正确方法是什么?
我希望我明白我的问题。谢谢。
答案 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页面上的嵌入代码在呈现阶段被调用,之前已经保存ViewState
(check here)。如果无法将该代码移至Page_Load
,则需要Session
(#4)来完成工作。
答案 1 :(得分:0)
会话是一个很好的解决方案。
您可以使用sessionState mode="SQLServer"
来提高会话性能和安全性。
参考:http://support.microsoft.com/kb/317604