You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET C#:非静态类设置界面可见性失效问题排查

问题根源:静态成员导致控件引用被共享

你遇到的问题百分之百是因为WhatsMyDay类里的控件字段被定义成了static!静态成员属于类本身,而不是类的每个实例——这意味着所有WhatsMyDay对象都会共享同一个ddlAM、ddlPM和tdTitle引用。

具体发生了什么?

  1. 你创建第一个WhatsMyDay实例(周一)时,静态的tdTitle被赋值为tdMondayTitle;
  2. 紧接着创建第二个实例(周二),静态的tdTitle被覆盖为tdTuesdayTitle;
  3. 遍历myDays时,第一个实例(周一)调用ShowHideInterface,实际操作的是周二的tdTitle(因为静态字段已经被第二个实例覆盖了);
  4. 最后第二个实例(周二)调用方法时,虽然传入了false,但前面的错误操作已经干扰了最终结果,导致你的隐藏预期不生效。

修复方案:去掉静态修饰符

把WhatsMyDay类里的控件字段改成实例成员,让每个对象持有自己的控件引用,这样就不会互相干扰了。修正后的代码如下:

public class WhatsMyDay {
    public WhatsMyDay(DayOfWeek day, DropDownList am, DropDownList pm, HtmlTableCell dTitle) {
        Day = day;
        ddlAM = am;
        ddlPM = pm;
        tdTitle = dTitle;
    }
    public DayOfWeek Day { get; private set; }
    // 移除static修饰符,改为实例私有属性
    private DropDownList ddlAM { get; set; }
    private DropDownList ddlPM { get; set; }
    private HtmlTableCell tdTitle { get; set; }
    public int? AM { 
        get { 
            int value = Convert.ToInt32(ddlAM.SelectedValue);
            return value == -1 ? null : (int?)value; 
        } 
    }
    public int? PM { 
        get { 
            int value = Convert.ToInt32(ddlPM.SelectedValue);
            return value == -1 ? null : (int?)value; 
        } 
    }
    public void ShowHideInterface(bool visibility) {
        tdTitle.Visible = visibility;
    }
}

额外优化建议

  • 可以给AM和PM的getter加异常处理(比如判断SelectedValue是否能正确转成int),避免运行时出现转换错误;
  • days和myDays如果不需要跨方法共享,建议改成局部变量或者非静态字段——静态集合在ASP.NET的多线程环境下容易引发线程安全问题。

内容的提问来源于stack exchange,提问作者Mr Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:41:23