关于静态变量如何在ASP.NET中工作的简单问题?

Xai*_*oft 1 c# asp.net

我有一张显示一些信息的地图.默认情况下,地图上的标签已关闭.有一个图像按钮,当标签关闭时,该图像按钮具有与其关联的关闭图像,当您打开标签时,该图像按钮具有与其关联的打开图像.我有代码工作,但我想要一个更好的理由,为什么它以这种方式工作.这是一段代码.

如果我声明一个类级别的布尔变量showLabels,如:

private bool showLabels = false;
Run Code Online (Sandbox Code Playgroud)

然后有以下代码:

if(showLabels == false)
{
    showLabels = true;
    imgShowLabels.ImageUrl = "label-on.png";
}
else
{
    showLabels = false;
    imgShowLabels.ImageUrl = "label-off.png";
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,地图会出现默认情况下未显示的标签.当我单击Show Labels按钮时,变量showLabels变为true并且图像变为label-on.png,但是当我再次单击它时,showLabels变量将重置为false,因此没有任何反应.

所以我做的是改变它:

private bool showLabels = false;
Run Code Online (Sandbox Code Playgroud)

private static bool showLabels = false;
Run Code Online (Sandbox Code Playgroud)

它正在以这种方式工作.

这是处理这种情况的正确方法吗?

在类级别,我把属性:

public bool ShowLabels
{
    get { return (bool)ViewState["ShowLabels"]; }
    set { ViewState["ShowLabels"] = value; }
}
Run Code Online (Sandbox Code Playgroud)

在if(!Page.IsPostBack)中,我将ShowLabels设置为false;

然后在我的if语句中,我正在做:

if(ShowLabels == false)
{
    ShowLabels = true;
    imgShowLabels.ImageUrl = "label-on.png";
}
else
{
    ShowLabels = false;
    imgShowLabels.ImageUrl = "label-off.png";
}
Run Code Online (Sandbox Code Playgroud)

但是ShowLabels总是假的,我认为通过ShowLabels属性设置ViewState,它会保留它的值.

Joe*_*orn 8

请记住,每次执行回发(出于任何原因,包括仅处理服务器事件),您都在使用页面类的全新实例.旧的一个已经死了,一旦页面最后一次呈现给浏览器就有资格使用.

当您将其更改为静态时它"有效",因为静态变量不与任何特定实例相关联.但是,我怀疑当你在更广阔的环境中开始测试时,你会感到惊讶.由于该站点的页面的所有用户都在同一个AppDomain中,因此他们都将设置相同的 showLabels变量.

要解决此问题,您需要将此变量存储在仅为该用户持久存在的位置.选项包括ViewState,Session,数据库或其他一些长期存储机制.我的偏好倾向于数据库(可能使用带有sql server的ASP.Net Personalization提供程序),因为用户可能希望您每次访问您的站点时都记住这一点.


怎么样:

ShowLabels = !ShowLabels;
imgShowLabels.ImageUrl = string.Format("label-{0}.png", (ShowLabels)?"on":"off");
Run Code Online (Sandbox Code Playgroud)