我有一张显示一些信息的地图.默认情况下,地图上的标签已关闭.有一个图像按钮,当标签关闭时,该图像按钮具有与其关联的关闭图像,当您打开标签时,该图像按钮具有与其关联的打开图像.我有代码工作,但我想要一个更好的理由,为什么它以这种方式工作.这是一段代码.
如果我声明一个类级别的布尔变量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,它会保留它的值.
请记住,每次执行回发(出于任何原因,包括仅处理服务器事件),您都在使用页面类的全新实例.旧的一个已经死了,一旦页面最后一次呈现给浏览器就有资格使用.
当您将其更改为静态时它"有效",因为静态变量不与任何特定实例相关联.但是,我怀疑当你在更广阔的环境中开始测试时,你会感到惊讶.由于该站点的页面的所有用户都在同一个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)
| 归档时间: |
|
| 查看次数: |
1012 次 |
| 最近记录: |