这可能听起来很天真,但我正在开发一个跨越多个页面的Web应用程序。所有这些页面都使用其API访问CMS的方法实例化相同的类对象。目前,当用户开始创建内容时,我将存储变量,如内容位于Session变量中的文件夹ID。
我的问题是:我可以实例化一个可以跨所有页面使用的类的单个实例,而不必在每个页面上执行吗?如果是这样,访问该页面的每个人都会获得他们自己的课程版本吗?我假设使用静态变量和方法不是可行的方法,因为它们在内存中共享。而且,如果它将在.net C#应用程序中的Web应用程序中全局使用,那么声明在哪里/如何声明?
答案 0 :(得分:7)
我建议创建一个继承自System.Page的基类。然后让你的页面代码继承自那。
然后,在基类内部创建一个属性,该属性是对象的引用。像这样,例如:
public class BasePage : System.Web.UI.Page
{
public Foo CurrentFoo
{
get
{
return (Foo)Session["FooSessionObject"];
}
set
{
if(Session["FooSessionObject"] == null)
{
// instantiate a new one
Session["FooSessionObject"] = new Foo();
}
Session["FooSessionObject"] = value;
}
}
}
然后,从任何页面的任何地方,只需要做一个CurrentFoo。并且您可以访问任何属性。
这使得后面的代码变得干净利落。
答案 1 :(得分:0)
如果要存储仅针对当前用户的信息,则应使用Session
状态。
例如,在应用程序的一个页面中,您可以将一些值存储到会话中:
SomeType someValue = ...
Session["someKey"] = someValue;
然后在其他页面上从会话中检索它:
SomeType someValue = (SomeType)Session["someKey"];
答案 2 :(得分:0)
您正在寻找的模式非常简单。有几种方法可以实现它。
每个都有其好处。
答案 3 :(得分:0)
关于这样做以及对网站使用全局覆盖会话这是一个简单的事实,即任何访问不管会话的用户都可以访问全局变量。例如,请使用下面的代码。
public class globals
{
static string _test = "MyTest";
public static string test
{
get
{
return _test;
}
set
{
_test = value;
}
}
在创建全局类之后,我将标签添加到默认值中,并将全局变量文本分配给标签。
protected void Page_Load(object sender, EventArgs e)
{
globals.test = "Some Data";
}
现在你会在你页面的每个表单上都看到这个,但是对于这个,访问你页面的任何人都可以看到这些数据。如果需要在多个会话中共享其数据,则可以执行此操作。如果其数据只需要当前用户在多个类上共享,则需要使用会话变量。