我试图绕过这个,但我不能。
假设我有一个名为custom的类。我有一个名为User_ID的变量,我用它来检索用户的会话(所以我不必一遍又一遍地调用会话变量)。像这样:
Public Class custom
Public Shared User_ID as integer
Public Shared sub GatherUserID()
User_ID = Session ("user_ID")
end sub
end class
是的,这是一个非常简单的例子,但它得到了我的观点。我在经典ASP(使用包含,而不是类)中做了类似的事情,而User_ID对于当时访问相关页面的人来说是唯一的。
出于某种原因,这是我不明白的,当我在自定义类中使用custom.User_ID时,它是为所有人共享的。这就是我不想要的。我想要的是能够使用这样的变量并保持用户特定的变量。我看到跨类共享变量的优势(例如数据库连接字符串),但我没有看到如何在自定义类中设置自定义变量,我只能为该用户使用而不必经常调用Sessions。
我看到我可以将它声明为Property而不是共享变量,但我真的不知道究竟要完成什么,似乎没有人有明确的解释。属性用户/会话特定?它会解决我的具体问题吗?这是我没有得到的。
编辑:为了澄清一下,本例中的user_ID是我打算在创建页面时调用的几个点中使用的东西(例如主文件,页面本身,各种类。)因此创建自定义变量的原因。
感谢。
答案 0 :(得分:1)
共享意味着它与应用领域中的所有人共享。当您调用方法并设置共享变量时,使用共享变量的所有内容都将返回相同的值。
您可以做的是封装对Session对象的访问权限。使用模块或我的首选方法,使用Extension方法和我挂起Session的共享自定义类。这允许我看到它来自Session,但是像Session.vars.UserID一样访问它,UserID是vars类的属性。
Module SessionExt
Public Class SessionVars
Private this as HttpSessionState
Public New (ths as HttpSessionState)
this = ths
End New
Public Property Example as Integer
Get
Static nm as String = MethodBase.GetCurrentMethod().Name.Substring(4)
return CType(this(nm), Integer)
End Get
Set (value as Integer)
Static nm as String = MethodBase.GetCurrentMethod().Name.Substring(4)
this(nm) = value
End Set
End Property
End Class
<Extension()>
Public Function vars(ByVal this as HttpSessionState) as SessionVars
return New SessionVars(this)
End Function
End Module
然后你去了,所有的会话变量都包含在一个很好的类中。添加新属性是简单的锅炉板代码,您只需更改名称并设置类型即可。您可以将其重构为更好的名称,查看它的使用位置,使用它来包含更复杂的结构(数据表,其他类或结构等)。
注意:如果您使用的是global.asax,则代码运行时可能尚未建立会话,请注意您从那里调用的任何属性都不使用会话状态,或者检查首先是null。
答案 1 :(得分:0)
Public Class custom
Public User_ID as integer
Public sub GatherUserID()
User_ID = Session ("user_ID")
end Sub
end Class
然后,对于每个启动会话的新用户:
Dim userSpecificCustom as New Custom()
userSpecificCustom.GatherUserID()
我是C#家伙,所以如果语法不是100%正确,请不要打倒我。
还建议将User_ID设为属性而不是公共字段。 (参见例如http://www.vbdotnetheaven.com/uploadfile/manish1231/fields-and-properties-in-vb-net/或http://blogs.msdn.com/b/vbteam/archive/2009/09/04/properties-vs-fields-why-does-it-matter-jonathan-aneja.aspx)