2012-08-14 71 views
0

我掙扎着一個奇怪的問題,我不知道如何解決它。我正在開發一個小型的基於網絡的事件管理系統。當用戶點擊將顯示在ModalPopUpExtender控件中的註冊按鈕時,系統將執行以下操作: 它將檢查用戶是否在數據庫中。如果沒有,它將從Active Directory中提取他的信息。 然後,系統應檢查用戶是否已在此事件中註冊。如果不是,他將在該事件中註冊併發送一封確認電子郵件給他。如果是,則會顯示一條消息,說明「您已在此活動中預訂。」如何修改此方法僅向非註冊用戶發送確認郵件?

我現在的問題是:系統發送確認電子郵件,無論用戶是否有預訂或在該事件。 那麼,我應該怎樣修改我的代碼,以便在唯一的情況下向用戶發送確認電子郵件,以防他在該事件中沒有預訂?

C#代碼(抱歉冗長的代碼,但我把它澄清):

protected void btnSendConfirmationEmail_Click(object sender, EventArgs e) 
    { 

     checkUserID(userNetworkID); 


     SmtpClient sc = new SmtpClient("MailServer"); 
     StringBuilder sb = new StringBuilder(); 
     MailMessage msg = new MailMessage(); 


     //Variables for retrieving the Booking Information 
     string title = lblTitle.Text; 
     string description = lblDescription.Text; 
     string location = lblLocation.Text; 
     string startDateTime = lblStartDateTime.Text; 
     string endDateTime = lblEndDateTime.Text; 

     //Message Information 
     string toAddress = userNetworkID + "@mailServer.com"; 
     string fromAddress = "[email protected]"; 
     string mailSubject = "Registration Notification"; 
     string messageBody = @"........................."; 

     try 
     { 
      msg.To.Add(toAddress); 
      msg.From = new MailAddress(fromAddress, "Reg. Test System"); 
      msg.Subject = mailSubject; 
      msg.Body = messageBody; 
      msg.IsBodyHtml = true; 

      sc.Send(msg); 
     } 

     catch (Exception ex) 
     { 
      throw ex; 
      // something bad happened 
      //Response.Write("Something bad happened!"); 

     } 

     finally 
     { 

      if (msg != null) 
      { 
       msg.Dispose(); 
      } 

     } 
    } 

    protected void checkUserID(string userID) 
    { 

     int eventID = Convert.ToInt32(HiddenField1.Value); 

     string NetworkID = userID; 
     string Name = Service.GetName; 
     string BadgeNo = Service.GetBadgeNo; 
     string DepartmentCode = Service.GetDeptCode; 

     string connString = "Data Source=localhost;Initial Catalog=TestSysDB;Integrated Security=True;"; 

     //if the user is not in the system database, add him 
     if (Security.isExisted(NetworkID) == false) 
     { 
      //string connString = "Data Source=localhost;Initial Catalog=TestSysDB;Integrated Security=True;"; 
      string insertCommand = "INSERT INTO Users (NetworkID, Name, BadgeNo, DepartmentCode) values (@NetworkID, @Name, @BadgeNo, @DepartmentCode)"; 

      using(SqlConnection conn = new SqlConnection(connString)) 
      { 
       //Open DB Connection 
       conn.Open(); 
       using(SqlCommand cmd = new SqlCommand(insertCommand, conn)) 
       { 
        cmd.Parameters.Clear(); 
        cmd.Parameters.AddWithValue("@NetworkID", NetworkID); 
        cmd.Parameters.AddWithValue("@Name", Name); 
        cmd.Parameters.AddWithValue("@BadgeNo", BadgeNo); 
        cmd.Parameters.AddWithValue("@DepartmentCode", DepartmentCode); 
        cmd.ExecuteNonQuery(); 
       } 
       conn.Close(); 
      } 
     } 

     string insertBooking = "INSERT INTO BookingDetails (EventID, NetworkID) values (@EventID, @NetworkID)"; 
     string selectCommand = "SELECT count(*) as UserBookings FROM BookingDetails WHERE NetworkID = NetworkID AND EventID = @EventID"; 
     using (SqlConnection conn = new SqlConnection(connString)) 
     { 
      //Open DB Connection 
      conn.Open(); 
      using (SqlCommand cmd = new SqlCommand(selectCommand, conn)) 
      { 
       cmd.Parameters.AddWithValue("@EventID", eventID); 
       cmd.Parameters.AddWithValue("@NetworkID", NetworkID); 
       if ((int)cmd.ExecuteScalar() == 0) 
       { 
        SqlCommand cmd2 = new SqlCommand(insertBooking, conn); 
        cmd2.Parameters.Clear(); 
        cmd2.Parameters.AddWithValue("@EventID", eventID); 
        cmd2.Parameters.AddWithValue("@NetworkID", NetworkID); 
        cmd2.ExecuteNonQuery(); 
       } 
       else 
       { 
        errorSpan.InnerText = "You already have a booking in this event"; 
       } 
      } 
      //Close the connection 
      conn.Close(); 
     } 


    } 
+1

BTW你的代碼是應該「活」在自己的圖層/類中的功能的混合體 - 提取SQL查詢(或使用NHibernate),ema il發送過程,電子郵件創建過程到分開的類。這將爲您節省後期頭痛... – 2012-08-14 07:23:22

+0

刪除您的插入代碼,導致您只需檢查是否存在該用戶標識的事件 – JohnnBlade 2012-08-14 07:27:46

回答

1

這樣

東西創建一個新的方法UserHasBooking

private bool UserHasBooking(int userId, int eventID) 
{ 
    bool result = false; 

string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=RegistrationSysDB;Integrated Security=True;"; 
string selectCommand = "SELECT count(*) as UserBookingsCount FROM BookingDetails WHERE NetworkID = NetworkID AND EventID = @EventID"; 
using (SqlConnection conn = new SqlConnection(connString)) 
{ 
    //Open DB Connection 
    conn.Open(); 
    using (SqlCommand cmd = new SqlCommand(selectCommand, conn)) 
    { 
     cmd.Parameters.AddWithValue("@EventID", eventID); 
     cmd.Parameters.AddWithValue("@NetworkID", userId); 
     if ((int)cmd.ExecuteScalar() > 0) 
     { 
      result = true; 
     } 
    } 
    //Close the connection 
    conn.Close(); 
} 

    return result; 
} 


protected void btnSendConfirmationEmail_Click(object sender, EventArgs e) 
    { 
     int eventID = Convert.ToInt32(HiddenField1.Value); 



     if(!UserHasBooking(userNetworkID, eventID)) 
     { 

     checkUserID(userNetworkID); 


     SmtpClient sc = new SmtpClient("MAIL.Aramco.com"); 
     StringBuilder sb = new StringBuilder(); 
     MailMessage msg = new MailMessage(); 


     //Variables for retrieving the Booking Information 
     string title = lblTitle.Text; 
     string description = lblDescription.Text; 
     string location = lblLocation.Text; 
     string startDateTime = lblStartDateTime.Text; 
     string endDateTime = lblEndDateTime.Text; 

     //Message Information 
     string toAddress = userNetworkID + "@aramco.com"; 
     string fromAddress = "[email protected]"; 
     string mailSubject = "Registration Notification"; 
     string messageBody = @"Greetings, <br /><br /> 
           Your booking information is as following: <br /><br /> 
           <b><u>Event Details</u></b> <br /><br /> 
           <b>Title: </b>" + title + 
           "<br /> <b>Description: </b>" + description + 
           "<br /> <b>Location: </b>" + location + 
           "<br /> <b>Start Date & Time: </b>" + startDateTime + 
           "<br /> <b>End Date & Time: </b>" + endDateTime + 
           @"<br /><br /><br /><br /> 
           This email was generated using the <a href='http://pmv/PM_Registration_System/Default.aspx'>Events Registration Management System (ERMS) </a>. 
           Please do not reply to this email."; 

     try 
     { 
      msg.To.Add(toAddress); 
      msg.From = new MailAddress(fromAddress, "Events Registration Management System"); 
      msg.Subject = mailSubject; 
      msg.Body = messageBody; 
      msg.IsBodyHtml = true; 

      sc.Send(msg); 
     } 

     catch (Exception ex) 
     { 
      throw ex; 
      // something bad happened 
      //Response.Write("Something bad happened!"); 

     } 

     finally 
     { 

      if (msg != null) 
      { 
       msg.Dispose(); 
      } 

     } 

     } 

    } 
+0

感謝您的幫助。但是,我根據您的幫助修改了我的代碼,但系統仍然向用戶發送電子郵件,我不知道爲什麼。 **請你看看我更新的問題,並幫助我完成這項工作嗎?** – 2012-08-14 07:20:36

+1

是用戶在測試代碼時是否高興地向他們發送電子郵件?你會在電廠設施中測試核電站安全軟件嗎?您應該使用虛擬電子郵件發件人測試代碼,該代碼不會發送電子郵件,而只是記錄您發送了它(關鍵字IoC,DI)。 – 2012-08-14 07:24:16

+0

我想你現在得到這個觀點 – JohnnBlade 2012-08-14 07:34:44

相關問題