2016-06-08 69 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

嘗試了兩種,但很遺憾仍然無法正常工作。還有其他建議嗎? –

相關問題