我在ASP上有一个复选框.网络内容格式如下:

<asp:CheckBox runat="server" ID="chkTest" AutoPostBack="true" OnCheckedChanged="chkTest_CheckedChanged" />

在我的代码隐藏中,我有以下方法:

protected void chkTest_CheckedChanged(object sender, EventArgs e)
{
}

当我在浏览器中加载页面并单击复选框时,它会变为选中状态,页面会回发,我可以看到调用了chkTest_CheckedChanged.

当我再次点击复选框时,它会被取消选中,页面会发回,但不会调用chkTest_CheckedChanged.

这个过程是可重复的,所以一旦取消选中复选框,选中它就会触发事件.

我在网络上禁用了视图状态.配置,启用视图状态会导致此问题消失.在视图状态保持禁用的情况下,我可以做些什么来可靠地触发事件?

Update:

Update 2:

推荐答案

实现将Checked属性存储在ControlState而不是ViewState中的自定义复选框可能会解决该问题,即使该复选框有AutoPostBack=false

与ViewState不同,ControlState不能被禁用,可以用来存储对控件行为至关重要的数据.

我现在没有要测试的visual studio环境,但应该是这样的:

public class MyCheckBox : CheckBox
{
    private bool _checked;

    public override bool Checked { get { return _checked; } set { _checked = value; } }

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        //You must tell the page that you use ControlState.
        Page.RegisterRequiresControlState(this);
    }

    protected override object SaveControlState()
    {
        //You save the base's control state, and add your property.
        object obj = base.SaveControlState();

        return new Pair (obj, _checked);
    }

    protected override void LoadControlState(object state)
    {
        if (state != null)
        {
            //Take the property back.
            Pair p = state as Pair;
            if (p != null)
            {
                base.LoadControlState(p.First);
                _checked = (bool)p.Second;
            }
            else
            {
                base.LoadControlState(state);
            }
        }
    }
}

更多信息here.

Asp.net相关问答推荐

如何在没有 Select 按钮的情况下在 GridView 中实现全行 Select ?

Firefox 和 Chrome 之间 1 像素的行高差

ASP MVC 授权除少数之外的所有操作

你能从请求变量中确定时区吗?

如何调试 Azure 500 内部服务器错误

无法访问,内部,资源文件?

如何使用 ASP.NET Identity 创建用户并获取新创建的 ID

无法加载文件或程序集 'System.Web.Mvc,版本 = 3.0.0.0,Elmah.MVC 问题

如何使用三个按钮是否和取消显示确认alert ,如 MS Word 中所示

我可以创建 .config 文件并将其包含到 web.config 中吗?

如何以编程方式将标签的前景色设置为其默认值?

通过 ASP.NET/C# 使用 Plupload

如何在 ASP.NET 中设置下拉列表项?

如何通过 Google 图表 API 使用 X 轴中的日期?

ASP.NET 应用程序状态与静态对象

在 Application_BeginRequest 中设置会话变量

在 C# 中动态创建 Json

在 ASP.NET MVC 中模拟 User.Identity

错误处理(向客户端发送 ex.Message)

RegisterStartupScript 不适用于 ScriptManager、Updatepanel.这是为什么?