简体   繁体   中英

OnClick button working only after second time Asp.NET c#

I'm new to web development and right now I'm working on a website. I have a problem with a Save button on an ASP.Net (front end) web form (back end is in C#). The button is supposed to save data entered in a textbox to a database.

When the Save button is clicked the first time, the page just 'reloads' and clear the textbox and nothing is saved in the SQL Server database (dbo connection). Then when I click the same 'Save' button a second time after re-entering information in the textbox, it actually saves to the database and goes back to a main menu page (as expected). And if I try to re-enter different information, the save button will be working just fine.

The problem happens when a user logs in and navigate to the page where he enters the data and saves it. It will never ever work the first time.

Unfortunately because of confidential purposes, I have to omit and rename certain file paths/directories and tables name!

Here's my Asp.NET code:

<%@ Page Language="C#" debug="True" Inherits="Default" src="Default.cs"      AutoEventWireup ="true"%>
<%@ Register TagPrefix="ob" TagName="ComboTree"  Src="/obout/Combotree/ComboTree.ascx" %>
<%@ Reference Control="/obout/Combotree/ComboTree.ascx" %>

<HTML>

<HEAD>
<!-- #INCLUDE VIRTUAL="/.../" -->

</HEAD>

<BODY >
<FORM runat="server">
  <BASEFONT face="Arial, Helvetica, Sans Serif" color=black size=2>
    <TABLE height="100%" cellSpacing=0 cellPadding=0 width="780" align=Center border=0>
      <!-- #INCLUDE VIRTUAL="/.../" -->
      <TR VALIGN="top">
      <!-- #INCLUDE VIRTUAL="/.../" -->
   `enter code here`<TD vAlign=top width="100%" HEIGHT="100%">
   <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0 HEIGHT="100%">
   <!-- #INCLUDE VIRTUAL="/.../" -->  
   <TR>
      <!-- #INCLUDE VIRTUAL="/.../" -->  
      <TD vAlign=top align=left >
      <!--- START YOUR CODE HERE!!!!! --->
      <script>
        function disableListItems(checkBoxListId, disable)
        {
            // Get the checkboxlist object.
            ctr = 0;
            while(1 == 1)
            {
                checkbox = document.getElementById(checkBoxListId + "_" + ctr);
                if(checkbox == null)
                {        
                    return;
                }
                checkbox.checked = true;
                checkbox.disabled = disable;
                ctr++;
            }

        }         

        function checkForm()
        {
            var errMsg = "";
            if(isBlank(document.getElementById("tbName").value))
            {
                errMsg += "\n-Folder Name";
            }

            if(errMsg!="")
            {
                alert("The following fields cannot be left blank." + errMsg);
                return false;
            }
            return true;

        }
      </script>
      <font Class="heading">File Library - <ASP:Label ID="lbTitle" RunAt="Server"/> Folder</font>
        <INPUT Type="Hidden" ID="hdFolderID" RunAt="Server"/>
        <INPUT Type="Hidden" ID="hdParentFolderID" RunAt="Server"/>
        <TABLE CellPadding="4" CellSpacing="0" Width="100%" >
        <TR>
            <TD ColSpan="2" Class="spreadsheet_line">&nbsp;</TD>
        </TR>
        <TR>
            <TD Class="Spreadsheet"><B>Name</B></TD>
            <TD Class="Spreadsheet" Width="100%"><ASP:TextBox ID="tbName" Columns="34" RunAt="Server"/></TD>
        </TR>
        <TR VAlign="Top" Visible="False" RunAt="Server">
            <TD Class="Spreadsheet" NOWRAP><B>Description</B></TD>
            <TD Class="Spreadsheet"><ASP:TextBox ID="tbDescription" TextMode="Multiline" Cols="25" Rows="5" RunAt="Server"/></TD>
        </TR>           
        <TR>
            <TD Class="Spreadsheet"><B>Active?</B></TD>
            <TD Class="Spreadsheet"><ASP:CheckBox ID="cbActive" RunAt="Server"/></TD>
        </TR>           
        <TR Visible="False" RunAt="Server">
            <TD Class="Spreadsheet"><B>Folder</B></TD>
            <TD Class="Spreadsheet"><ob:ComboTree id="ctFolders" runat="server"/></TD>
        </TR>
        <TR VAlign="Top" ID="trLicensees" RunAt="Server">
            <TD Class="Spreadsheet"><B>Departments</B></TD>
            <TD Class="Spreadsheet">
                <ASP:DropDownList ID="ddLicensee" DataTextField="Name" DataValueField="DepartmentId" RunAt="Server"/>
                <ASP:CheckBox ID="cbAll" Text="All" RunAt="Server"/>
                <div style="text-align: left; width: 30%; margin-left:-3px">
                    <ASP:CheckBoxList ID="cblLicensees" DataTextField="Name" DataValueField="DepartmentId" style="background-color:F3F3F3" RunAt="Server"/> <!--**-->
                </div>
            </TD>
        </TR>
        <TR>
            <TD Class="Spreadsheet" Align="Right" ColSpan="2">
                <ASP:ImageButton ID="btnSave" OnClick="btnSave_OnClick" ImageUrl="/images/buttons/btnSave.gif" RunAt="Server"/>
            </TD>
        </TR>
        </TABLE>
      <!--- END YOUR CODE HERE!!!!! --->
      </TD>
      <!-- #INCLUDE VIRTUAL="/.../" -->  
   </TR>
   <!-- #INCLUDE VIRTUAL="/.../" -->  
  </TABLE>
</TD>
<!-- #INCLUDE VIRTUAL="/.../" -->  
</TR>
<!-- #INCLUDE VIRTUAL="/.../" -->  
</TABLE>
</BASEFONT>
</FORM>
</BODY>
</HTML>

And here's the (back end) code for the Save button written in C#:

    public void btnSave_OnClick(object sender, System.Web.UI.ImageClickEventArgs E){    
    int counter = int.Parse(Request.Cookies["counter"].Value);
    counter++;
    Response.Cookies["counter"].Value = counter.ToString();

    try{
    SqlConnection Conn = GetConnection();
    string SQL;
    SqlCommand Cmd;
    SqlDataReader Dtr;

        if(hdFileID.Value=="")
        {
            Response.Write("Executing Save (adding new folder to DB");
            SQL = "EXEC sp_File_Add @Name,@Description,@UserID";
            Response.Write("Save successfully executed. Added to DB");
        }
        else
        {
            Response.Write("Executing Save (saving info of folder to DB");
            SQL = "EXEC sp_File_Update @Name,@Description,@UserID,@FileID";
            Response.Write("Save successfully executed. Saved to DB");
        }




        Cmd = new SqlCommand(SQL,Conn);

        Cmd.Parameters.Add(new SqlParameter("@Name", SqlDbType.VarChar));
        Cmd.Parameters["@Name"].Value = tbName.Text;

        Cmd.Parameters.Add(new SqlParameter("@Description", SqlDbType.Text));
        Cmd.Parameters["@Description"].Value = tbDescription.Text;

        Cmd.Parameters.Add(new SqlParameter("@UserID", SqlDbType.Int));
        Cmd.Parameters["@UserID"].Value = Convert.ToInt32(hdUserID_Global.Value);

        if(hdFileID.Value!="")
        {
            Cmd.Parameters.Add(new SqlParameter("@FileID", SqlDbType.Int));
            Cmd.Parameters["@FileID"].Value = Convert.ToInt32(hdFolderID.Value);
        }

        Cmd.ExecuteNonQuery();

        if(hdFileID.Value=="")
        {
            SQL = "SELECT MAX(FileID) AS FileID FROM tbl_File WHERE CreatedByUserID=@UserID";
            Cmd = new SqlCommand(SQL,Conn);

            Cmd.Parameters.Add(new SqlParameter("@UserID", SqlDbType.Int));
            Cmd.Parameters["@UserID"].Value = Convert.ToInt32(hdUserID_Global.Value);

            Dtr = Cmd.ExecuteReader();

            if(Dtr.Read())
            {
                hdFileID.Value = Dtr["FileID"].ToString();
            }
            Dtr.Close();
        }

        SQL = "DELETE FROM tbl_FileLicense ";
        SQL += " WHERE FileID=@FileID ";

        Cmd = new SqlCommand(SQL,Conn);

        Cmd.Parameters.Add(new SqlParameter("@FileID", SqlDbType.Int));
        Cmd.Parameters["@FileID"].Value = Convert.ToInt32(hdFileID.Value.ToString());

        Cmd.ExecuteNonQuery();

        if(ddLicense.Visible)
        {
            SQL = "EXEC sp_doc_Folder_Add @FileID,@LicenseID,@UserID";
            Response.Write("Save successfully executed. Added to DB");
            Cmd = new SqlCommand(SQL,Conn);

            Cmd.Parameters.Add(new SqlParameter("@FolderID", SqlDbType.Int));
            Cmd.Parameters["@FileID"].Value = Convert.ToInt32(hdFileID.Value.ToString());

            Cmd.Parameters.Add(new SqlParameter("@LicenseID", SqlDbType.Int));
            Cmd.Parameters["@LicenseID"].Value = Convert.ToInt32(ddLicense.SelectedItem.Value.ToString());

            Cmd.Parameters.Add(new SqlParameter("@UserID", SqlDbType.Int));
            Cmd.Parameters["@UserID"].Value = Convert.ToInt32(hdUserID_Global.Value);

            Cmd.ExecuteNonQuery();
        }
        else
        {
        }

        Conn.Close();
        Response.Redirect("/Library/Default2.aspx?FileID=" + Request["RootFileID"].ToString());
        Response.End();
    }

    catch (Exception e){
        Response.Write("An error occurred while saving: " + e);
        Response.End();
    }

}

I've been struggling for more than 2 days on that and I don't see why the button is not firing the first time but only as from the 2nd time. Any help will be greatly appreciated. Thank you.

You should open connection ie Conn.open() before executing cmd.ExecuteNonQuery() method.

Try this, if it still doesn't work, in first line of webform.aspx ie <%@ Page Language="C#" add this attribute and see if it works: EnableEventValidation="false" . Also check the flow of code by setting breakpoints.

我通过在asp.NET代码中的<FORM runat="server">标记中添加EnableViewState = False来实现它

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM