【问题标题】:Button Fires Twice - 2 records inserted in Database按钮触发两次 - 在数据库中插入 2 条记录
【发布时间】:2011-06-18 22:52:10
【问题描述】:

在 AutoEventWireup = true 的情况下在 MasterPage 中运行。我无法改变这一点。 按钮在数据库中插入新记录。
当按钮点击时,插入两条记录。

  <asp:Button ID="AddLab" Text="Add Lab" OnClick="AddLab_OnClick" CssClass="btn" runat="server" />

页面指令:

    AutoEventWireup="true"  <- I have tried removing this, setting to false.

PageLoad/PreRender 显示按钮在这里没有做任何事情:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DbDataReader ddrGrp = rdoGroups();
            if (ddrGrp.HasRows)
            {
                rdoGroup.DataSource = ddrGrp;
                rdoGroup.DataBind();
            }
            ddrGrp.Close();
            // preset filter by lab to true
            CheckBox FiltLabs = (CheckBox)CommonUI.FindCtrlRecursive(this.Master, "FiltLabs");
            FiltLabs.Checked = true;
        }

    }

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
        // nothing yet
        rdoLabs.Items.Clear();
        DbDataReader ddrLab = rdoUserLabs();
        if (ddrLab.HasRows)
        {

            rdoLabs.DataSource = ddrLab;
            rdoLabs.DataBind();
            if (CommonUI.strTest((string)Session["rdoLabs"]))
            {
                if (Convert.ToInt32(Session["rdoLabs"]) > 0)
                {
                    rdoLabs.SelectedValue = (string)Session["rdoLabs"];
                }
            }
        }
        ddrLab.Close();
        // get group-lab mappings
        cboGroupLab.Items.Clear();
        DbDataReader ddrGroupLab = cboGroupLabsMap();
        if (ddrGroupLab != null)
        {
            if (ddrGroupLab.HasRows)
            {

                cboGroupLab.DataSource = ddrGroupLab;
                cboGroupLab.DataBind();
            }
        }
    }

    protected void AddLab_OnClick(object sender, EventArgs e)
    {
        LabAdmn labAdd = new LabAdmn();
        TextBox txtLab = (TextBox)CommonUI.FindCtrlRecursive(this.Master, "txtLab");
        CheckBox Active = (CheckBox)CommonUI.FindCtrlRecursive(this.Master, "cboLabActive");
        string[] strArr = new string[] { "lab_id" };
        labAdd.LabName = txtLab.Text;
        labAdd.Active = (bool)Active.Checked;
        // AddLab is where record is fired...see below...
        Hashtable ht = labAdd.AddLab(labAdd, strArr);
        ht = labAdd.AddLab(labAdd, strArr);
        if (ht != null)
        {
            HiddenField hLabId = (HiddenField)CommonUI.FindCtrlRecursive(this.Master, "hLabId");
            hLabId.Value = Convert.ToString(GetHTParm(ht, strArr[0]));
        }


    }
    #endregion AddLab_OnClick

    #region AddLab
    public Hashtable AddLab(LabAdmn labAdmn, string[] colOutputNames)
    {
        DAL myDal = new DAL(DBType, DB);
        Hashtable ht = new Hashtable();
        DAL.Parameters[] parms = new DAL.Parameters[]
        {
            new DAL.Parameters("driver_id","A",ParameterDirection.Input),
            new DAL.Parameters("lab_id",labAdmn.LabId,ParameterDirection.InputOutput),
            new DAL.Parameters("active",labAdmn.Active,ParameterDirection.Input),
            new DAL.Parameters("lab_name",labAdmn.LabName,ParameterDirection.Input)
        };
        CommandType cmdType = CommandType.StoredProcedure;
        string cmdText = "asp_Labs_Admin";
        ht = myDal.ExecuteQueryOutput(cmdType, cmdText, colOutputNames, parms, true);
        return ht;

    }
    #endregion AddLab

我读过 onclick 和 runat 会导致双重处理。如果我删除 runat,该按钮将不会显示,因为它是服务器端按钮。如果删除 OnClick 事件,无论 AutoEventWireup 是 true、false 还是已删除,该事件都不会触发。

【问题讨论】:

  • 您能否格式化其余代码以及难以阅读的代码?此外,Prerender 也不是您想要进行数据绑定的地方。通常,您会在控件呈现为 html 之前对其进行任何处理。
  • 这听起来很奇怪。但是你能检查你的页面是否有不指向任何图像或不存在的图像的图像标签。

标签: c# asp.net events button handler


【解决方案1】:

如果您没有将处理程序附加到按钮两次,请查看代码中的某处。也许在设计器中附加了一个事件处理程序。也许在你的初始化代码的某个地方。

尝试使用按钮删除您的代码并重新放置,标记中没有 onclick 属性。在你的页面或控件中添加到“oninit”下面

AddLab.Click += this.AddLab_OnClick;

但首先,尝试删除标记的属性,然后再试一次,如果它仍然触发两次

【讨论】:

    【解决方案2】:

    您可以将 AddLab_OnClick() 方法重命名为其他名称并在 OnClick="" 处理程序中分配它吗?我在想 AutoEventWireup 正在触发第一个事件,而第二个事件是由于 OnClick 再次分配..

    另外,试试卢克的建议。这将证明事件分配..

    【讨论】:

      【解决方案3】:

      您似乎调用了两次“AddLab”方法:

      Hashtable ht = labAdd.AddLab(labAdd, strArr);
              ht = labAdd.AddLab(labAdd, strArr);
      

      【讨论】:

      • 是的,我很着急,大约 12 小时后我完全错过了。谢谢。
      • 没问题,有时你只需要第二双眼睛 =)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      相关资源
      最近更新 更多