2016-06-08 68 views
1

我是网络开发新手,现在我正在网站上工作。 ASP.Net(前端)Web表单上的Save按钮有问题(后端在C#中)。该按钮应该将输入到文本框中的数据保存到数据库中。OnClick按钮只能在第二次使用Asp.NET c#

当第一次单击保存按钮时,页面只是'重新加载'并清除文本框,并且没有任何内容保存在SQL Server数据库(dbo连接)中。然后,当我在文本框中重新输入信息后再次单击相同的“保存”按钮时,它实际上会保存到数据库并返回到主菜单页面(如预期的那样)。如果我尝试重新输入不同的信息,保存按钮将工作得很好。

当用户登录并导航到他输入数据并保存该数据的页面时,会发生此问题。它永远不会第一次工作。

不幸的是,由于保密的目的,我必须省略和重命名某些文件路径/目录和表名!

这里是我的Asp.NET代码:

<%@ 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> 

这里是为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 [email protected]"; 
      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 [email protected] "; 

     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(); 
    } 

} 

我一直在挣扎了2个以上在那个日子里,我不明白为什么按钮不是第一次触发,而只是从第二次开始。任何帮助将不胜感激。谢谢。

+1

尝试调试,看看哪些事件被解雇的第一个点击按钮,我怀疑这是Page_Load事件 –

+0

在第一线webform.aspx即<%@ Page Language =“C#”添加此属性并查看它是否有效。 EnableEventValidation = “假”。还要通过设置断点来检查代码流。 –

回答

0

我得到它通过在asp.NET代码在<FORM runat="server">标签添加EnableViewState = False工作

0

在执行cmd.ExecuteNonQuery()方法之前,应该打开连接,即Conn.open()

试试这个,如果它仍然无法正常工作,在webform.aspx即第一行<%@ Page Language="C#"添加此属性,看看它的工作原理:EnableEventValidation="false"。还要通过设置断点来检查代码流。

+0

尝试了两种,但很遗憾仍然无法正常工作。还有其他建议吗? –

相关问题