ASP.NET如何保持变量值

时间:2010-06-23 22:41:17

标签: asp.net

嗨伙计们,我有一个很大的疑问...... 从nwo开始,我总是像这样声明我的aspx变量页

Partial Public Class myPage
    Inherits System.Web.UI.Page

    Protected Shared Variable1 As Integer
    Protected Shared array1(10) As String

声明受保护的共享,我的变量“保持”我在页面中调用的每个函数的值,并且它们在每个回发中保留它们的值。

但昨天有人告诉我,所有用户访问我的网站的变量都是SHARED ..(所以用户A看到用户B的变量值,用户C等)

任何人都可以帮我澄清一下吗?

4 个答案:

答案 0 :(得分:2)

你的方法几乎肯定是个坏主意。

共享变量为您的应用程序实例化一次,并为访问它的任何线程保留放入其中的最后一个值。仔细考虑依赖于变量值的任何代码 - 对任何两行代码之间的任何时候发生的任何代码的修改都可能来自正在执行可能修改它的代码的任何线程

Shared与最终用户本身的可见性无关。 Shared表示该变量只有一个实例,因此每个实例化myPage类的请求都将使用完全相同的内存作为其Variable1和array1引用。 Protected修饰符确保除myPage或派生类之外的任何类都不能查看和修改变量,但执行使用myPage的请求的任何用户肯定会使用相同的变量引用 - 并因此改变任何其他用户的价值。

如果要维护用户会话的变量值,请使用Session对象,这正是它的用途。

Session["Variable1"] = "usersProtectedString";

如果要维护整个应用程序中所有用户的值,请使用Application对象。

Application.Lock();
Application["Variable1"] = "stringForAllUsers";
Application.Unlock();

答案 1 :(得分:0)

共享意味着共享。它可以被其他用户同时访问。 尝试

Partial Public Class myPage
    Inherits System.Web.UI.Page

    Protected Shared Variable1 As String
    Protected Shared array1(10) As String

并启动它

Dim mypage As New myPage
mypage.Variable1 = "My Protected String That No One Else Can Gain Access To"

如果您需要在多个页面中维护变量,请使用会话变量。

Session("Variable1") = "My string that I can use all over the site but is still only accessible by me"

您还可以在变量中存储不同类型的对象

Dim theDate as DateTime = DirectCast(Session("theDate"), DateTime)

答案 2 :(得分:0)

AFAIK,如果需要,有两种方法可以在ASP.Net中共享变量:

  1. 使用Application对象,因为整个应用程序池只有一个。
  2. 使用静态变量。几年前,这一点让我陷入困境,所以我确实学到了这一课。

答案 3 :(得分:-1)

没有特别的理由为什么这些变量会在回发中保持状态。当然,它们不会在用户之间共享。如果它们保留了值,那是因为其他人保存了它们(可能在页面视图状态中?)