gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:28:55 24 4
gpt4 key购买 nike

我有一张显示一些信息的 map 。默认情况下, map 上的标签处于关闭状态。有一个图像按钮,当您关闭标签时,它有一个与之关联的关闭图像,当您打开标签时,它有一个与之关联的打开图像。我的代码可以正常工作,但我想要一个更好的理由来说明为什么它以这种方式工作。这是一段代码。

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

private bool showLabels = false;

然后有如下代码:

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

当我运行它时, map 会显示默认情况下未显示的标签。当我点击 Show Labels 按钮时,变量 showLabels 变为 true,图像变为 label-on.png,但当我再次点击它时,showLabels 变量重置为 false,所以没有任何反应。

所以我所做的是将其更改为:

private bool showLabels = false;

private static 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 始终为 false,我认为通过属性 ShowLabels 设置 ViewState,它会保留其值。

最佳答案

请记住,每次执行回发(出于任何原因,包括处理服务器事件)时,您都在使用页面类的全新实例。旧的已经死了,一去不复返了——只要页面最后一次呈现给浏览器,它就有资格一次性使用。

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

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


怎么样:

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

关于c# - 关于静态变量如何在 ASP.NET 中工作的简单问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1126514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com