我在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相关问答推荐

授权错误错误 400:C# 上的 redirect_uri_mismatch

ASP.NET Core 2.0 Razor 与 Angular/React/等

新的 csproj 文件结构可以与 ASP.NET Framework 项目一起使用吗?

我应该如何将 DbContext 实例注入 IHostedService?

如何在 asp net core api 中使用 Created(或 CreatedAtAction / CreatedAtRoute)

为什么 Razor Pages 是在 Asp.net Core 中创建 Web UI 的推荐方法?

Dotnet core 2.0 身份验证多模式身份 cookie 和 jwt

默认 HTTP 标头是否有任何常量?

如何在 ASP.NET Core 中获取我网站的 baseurl?

.NET 框架 3.5 和 TLS 1.2

等价于 ASP.NET Core 中的 Html.RenderAction

InvalidOperationException:在程序集上找不到“UserSecretsIdAttribute”

使用 ASP.NET Core 将 PDF 返回到浏览器

没有注册类型“Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory”的服务

IIS 10 上的 ASP.NET Core 404 错误

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

如何使用实体框架执行原始 SQL 查询而无需使用模型?

如何防止 Azure 网站进入Hibernate 状态?

UseSqlServer 方法缺少 MVC 6

在 ApiController 中添加自定义响应头