C# 关于ASP.NET中静态变量如何工作的简单问题?
我有一张显示一些信息的地图。默认情况下,地图上的标签处于禁用状态。有一个图像按钮,当您关闭标签时,该按钮具有与之关联的已关闭图像;当您打开标签时,该按钮具有与之关联的已打开图像。我有代码工作,但我想要一个更好的理由来解释为什么它是这样工作的。下面是一段代码 如果我声明一个类级布尔变量showLabels,如下所示:C# 关于ASP.NET中静态变量如何工作的简单问题?,c#,asp.net,C#,Asp.net,我有一张显示一些信息的地图。默认情况下,地图上的标签处于禁用状态。有一个图像按钮,当您关闭标签时,该按钮具有与之关联的已关闭图像;当您打开标签时,该按钮具有与之关联的已打开图像。我有代码工作,但我想要一个更好的理由来解释为什么它是这样工作的。下面是一段代码 如果我声明一个类级布尔变量showLabels,如下所示: private bool showLabels = false; 然后有以下代码: if(showLabels == false) { showLabels = true;
private bool showLabels = false;
然后有以下代码:
if(showLabels == false)
{
showLabels = true;
imgShowLabels.ImageUrl = "label-on.png";
}
else
{
showLabels = false;
imgShowLabels.ImageUrl = "label-off.png";
}
当我运行它时,地图会显示默认情况下未显示的标签。当我单击Show Labels按钮时,变量showLabels变为true,图像变为label-on.png,但当我再次单击它时,showLabels变量重置为false,因此不会发生任何事情
因此,我所做的是将其从:
private bool showLabels = false;
到
它是这样工作的
这是处理这种情况的正确方法吗
在类级别中,我放置了以下属性:
public bool ShowLabels
{
get { return (bool)ViewState["ShowLabels"]; }
set { ViewState["ShowLabels"] = value; }
}
在if(!Page.IsPostBack)中,我将ShowLabels设置为false
那么在我的if声明中,我正在做:
if(ShowLabels == false)
{
ShowLabels = true;
imgShowLabels.ImageUrl = "label-on.png";
}
else
{
ShowLabels = false;
imgShowLabels.ImageUrl = "label-off.png";
}
但是ShowLabels总是错误的,我认为通过属性ShowLabels设置ViewState,它将保留其值。不确定ASP,但作为一种样式,它具有
if(showLabels == false)
不太可读。你应该使用
if(!showLabels)
相反对ASP不太清楚,但作为一种风格
if(showLabels == false)
不太可读。你应该使用
if(!showLabels)
相反请记住,每次回发(出于任何原因,包括只是为了处理服务器事件)时,您都在使用页面类的全新实例。旧的一个已经死了,并且不见了——当页面最后一次呈现到浏览器上时,它就可以一次性使用了 当您将其更改为静态时,它“起作用”,因为静态变量与任何特定实例都没有关联。然而,当您开始在更广泛的环境中测试时,我怀疑您会感到惊讶。由于该站点页面的所有用户都在同一AppDomain中,因此他们都将设置相同的showLabels变量 要解决此问题,您需要将此变量存储在某个仅适用于该用户的位置。选项包括ViewState、会话、数据库或其他一些长期存储机制。我的偏好倾向于数据库(可能使用sql server的ASP.Net个性化提供程序),因为用户每次访问您的站点时都可能希望您记住这一点
那么:
ShowLabels = !ShowLabels;
imgShowLabels.ImageUrl = string.Format("label-{0}.png", (ShowLabels)?"on":"off");
请记住,每次回发(出于任何原因,包括只是为了处理服务器事件)时,您都在使用一个全新的page类实例。旧的一个已经死了,并且不见了——当页面最后一次呈现到浏览器上时,它就可以一次性使用了 当您将其更改为静态时,它“起作用”,因为静态变量与任何特定实例都没有关联。然而,当您开始在更广泛的环境中测试时,我怀疑您会感到惊讶。由于该站点页面的所有用户都在同一AppDomain中,因此他们都将设置相同的showLabels变量 要解决此问题,您需要将此变量存储在某个仅适用于该用户的位置。选项包括ViewState、会话、数据库或其他一些长期存储机制。我的偏好倾向于数据库(可能使用sql server的ASP.Net个性化提供程序),因为用户每次访问您的站点时都可能希望您记住这一点
那么:
ShowLabels = !ShowLabels;
imgShowLabels.ImageUrl = string.Format("label-{0}.png", (ShowLabels)?"on":"off");
否,因为这是一个多线程多用户应用程序,所有web应用程序通常都是这样。如果将变量设置为static,则当其启用为true时,实际上是为站点上的每个用户打开标签 既然您说这是ASP.NET,您可能想将其存储在ViewState中。您可以通过以下方式完成此操作:
ViewState["ShowLabels"] = false;
你可以把它包装成一个属性
public bool ShowLabels {
get { return (bool)ViewState["ShowLabels"]; }
set { ViewState["ShowLabels"] = value; }
}
希望这有帮助。ViewState的替代方法是SessionState,您可以对其使用相同的构造
public bool ShowLabels {
get { return (bool)Session["ShowLabels"]; }
set { Session["ShowLabels"] = value; }
}
否,因为这是一个多线程多用户应用程序,所有web应用程序通常都是这样。如果将变量设置为static,则当其启用为true时,实际上是为站点上的每个用户打开标签 既然您说这是ASP.NET,您可能想将其存储在ViewState中。您可以通过以下方式完成此操作:
ViewState["ShowLabels"] = false;
你可以把它包装成一个属性
public bool ShowLabels {
get { return (bool)ViewState["ShowLabels"]; }
set { ViewState["ShowLabels"] = value; }
}
希望这有帮助。ViewState的替代方法是SessionState,您可以对其使用相同的构造
public bool ShowLabels {
get { return (bool)Session["ShowLabels"]; }
set { Session["ShowLabels"] = value; }
}
Joel一针见血,但我要补充的是,您可能应该将功能放在客户端上,以确保静态变量不会意外清理 我会这样做:
<a href="[YourPageHere.aspx]?showLabel=[togglethisvalue]>Show Labels</a>
对于Webforms。然后可以将其作为查询变量处理。这样你就需要有正确的价值观。在客户端有很多其他的方法可以做到这一点。为了简单起见,我使用了查询变量方法,但这可能不适用于您的页面变得更健壮的情况。Joel一针见血,但我想补充一点,您可能应该做的是将功能放在客户端上,以确保不会意外清理静态变量 我会这样做:
<a href="[YourPageHere.aspx]?showLabel=[togglethisvalue]>Show Labels</a>
对于Webforms。然后可以将其作为查询变量处理。这样你就需要有正确的价值观。在客户端有很多其他的方法可以做到这一点。为了简单起见,我使用了查询变量的方法,但这可能不适用于您的页面变得更健壮。或者更好:颠倒顺序,只需说if(showLabels),我同意如果您需要在“if..else”中测试true和false,那么肯定应该先进行(如Joel所建议的)。但是,对我来说,仅使用“==false”测试false要比使用“!”更容易理解@凯文,我真的同意这一点。你