2011-01-31 3 views
1

Работа в MasterPage с AutoEventWireup = true. Я не могу это изменить. Кнопка вставляет новую запись в базу данных.
При нажатии кнопки две записи вставляются.Button Fires Twice - 2 записи, вставленные в базу данных

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

PageDirective:

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 истинным, ложным или удаленным.

+0

Не могли бы вы форматировать остальную часть кода, а также его трудно читать? Кроме того, Prerender - это не то место, где вы хотите выполнить привязку данных. Как правило, вы делаете любую обработку с помощью элемента управления, прежде чем он будет передан в html. – WorldIsRound

+0

Это будет звучать странно. Но можете ли вы проверить свою страницу на теги изображений, которые не указывают на какие-либо изображения или изображения, которые не существуют. – Phill

ответ

1

Пожалуйста, посмотрите где-нибудь в своем коде, если вы не прикрепляете обработчик к кнопке дважды. Возможно, в конструкторе есть обработчик событий. Может быть, где-то в вашем коде инициализации.

Попробуйте удалить код с помощью кнопки и поместите его снова, без атрибута onclick в разметке. добавить в вашу страницу или контроль в «OnInit» после

AddLab.Click += this.AddLab_OnClick; 

Но сначала попробуйте удалить атрибут разметки и попробуйте еще раз, если он все еще стреляет дважды

0

Вы можете переименовать AddLab_OnClick() метод для чего-то другого и назначить это в обработчике OnClick = ""? Я думаю, что AutoEventWireup запускает первое событие, а второе из-за назначения OnClick снова.

Кроме того, попробуйте, что предложил Люк. Это будет доказать присвоений событий ..

2

Похоже, вы вызываете метод «AddLab» дважды:

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

Да, я спешил, и примерно через 12 часов я полностью пропустил это. Благодарю. – eric

+0

Нет проблем, иногда вам просто нужен второй набор глаз =) – Rich

Смежные вопросы