2013-07-15 2 views
1

У меня есть страница с «Доступ к папке» и одна CheckBox.Отправить список рассылки C#

Сегодня в моем .cs для каждого checkbox проверяемого в этом Folder Access, я отправить сообщение владельцу этой папки. Чтобы получить это письмо, я создаю на своей странице HiddenField для электронной почты.

Но теперь у меня есть более одного владельца для каждой папки. если он продолжит этот путь, у меня есть повторяющиеся строки. Как я могу получить список для электронной почты для каждой папки?

Мои .aspx

<Columns> 
    <asp:BoundField DataField="FolderAccess" HeaderText="Folder Access" /> 
    <asp:TemplateField> 
     <ItemTemplate> 
      <asp:CheckBox ID="CheckBox1" runat="server" Text="Access to Read" OnCheckedChanged="CheckBox1_ChangeCheck" 
       AutoPostBack="true" /> 
      <asp:HiddenField ID="Email" runat="server" Value='<%# Bind("Email") %>' /> 
     </ItemTemplate> 
    </asp:TemplateField> 
</Columns> 

Мои .cs

public class ListRequest 
{ 
    public string Email { get; set; } 
    public string FolderAccess { get; set; } 
} 

public List<ListRequest> PreencheValores(SqlDataReader reader) 
{ 
    var lista = new List<ListRequest>(); 
    while (reader.Read()) 
    { 
     var listRequest = new ListRequest(); 

     listRequest.Email = reader["Email"].ToString(); 
     listRequest.FolderAccess = reader["FolderAccess"].ToString(); 
     lista.Add(listRequest); 
    } 
    return lista; 
} 


public List<ListRequest> ConsultarRequest() 
{ 
    var lstRetorno = new List<ListRequest>(); 
    using (objConexao = new SqlConnection(strStringConexao)) 
    { 
     using (objCommand = new SqlCommand(strSelectPorID, objConexao)) 
     { 
      try 
      { 
       objConexao.Open(); 
       var objDataReader = objCommand.ExecuteReader(); 
       if (objDataReader.HasRows) 
        lstRetorno = PreencheValores(objDataReader); 
      } 
      catch (Exception ex) 
      { 
       throw new Exception(ex.Message); 
      } 
      finally 
      { 
       objConexao.Close(); 
      } 
     } 
    } 
    return lstRetorno; 
} 

protected void btnSend_OnClick(object sender, EventArgs e) 
{ 
    foreach (GridViewRow row in GridView.Rows) 
    { 
     CheckBox check = (CheckBox)row.FindControl("CheckBox1"); 
     HiddenField hd1 = (HiddenField)row.FindControl("Email"); 
     string email = hd1.Value.ToString(); 

     if (check.Checked == true) 
     { 

      System.Net.Mail.MailMessage objEmail = new System.Net.Mail.MailMessage(); 
      objEmail.From = new MailAddress("[email protected]", "XXX"); 
      objEmail.To.Add(email); 
      objEmail.Priority = System.Net.Mail.MailPriority.High; 
      objEmail.IsBodyHtml = true; 
      objEmail.Subject = "System NDRSecurity - Novas Requisições."; 
      objEmail.Body = "TEST"; 
      objEmail.SubjectEncoding = Encoding.GetEncoding("ISO-8859-1"); 
      objEmail.BodyEncoding = Encoding.GetEncoding("ISO-8859-1"); 
      SmtpClient objSmtp = new SmtpClient("XXX"); 
      objSmtp.EnableSsl = true; 
      objSmtp.Port = 25; 
      objSmtp.Credentials = new NetworkCredential("[email protected]", "XXX"); 
      objSmtp.Send(objEmail); 
     } 
    } 

    Response.Redirect("home.aspx"); 
} 

ответ

1

Я полагаю, вы могли бы сделать ваш ListRequest объект содержит список адресов электронной почты. Тогда ваше скрытое поле будет содержать этот список.

public class ListRequest 
{ 
    public List<string> EmailAddresses { get; set; } 
    public string FolderAccess { get; set; } 
} 

Тогда вам нужно будет изменить свой onlcick на цикл над значениями в переменной hd1.

if (check.Checked == true) 
{ 
    foreach(string email in (List<string>hd1.Value)) 
    { 
     System.Net.Mail.MailMessage objEmail = new System.Net.Mail.MailMessage(); 
     objEmail.From = new MailAddress("[email protected]", "XXX"); 
     objEmail.To.Add(email); 
     objEmail.Priority = System.Net.Mail.MailPriority.High; 
     objEmail.IsBodyHtml = true; 
     objEmail.Subject = "System NDRSecurity - Novas Requisições."; 
     objEmail.Body = "TEST"; 
     objEmail.SubjectEncoding = Encoding.GetEncoding("ISO-8859-1"); 
     objEmail.BodyEncoding = Encoding.GetEncoding("ISO-8859-1"); 
     SmtpClient objSmtp = new SmtpClient("XXX"); 
     objSmtp.EnableSsl = true; 
     objSmtp.Port = 25; 
     objSmtp.Credentials = new NetworkCredential("[email protected]", "XXX"); 
     objSmtp.Send(objEmail); 
    } 
} 
+0

, но этот путь не будет показывать повторяющиеся строки в моей странице доступа к папкам? Или, если я использую List для отправки по электронной почте, он продолжает показывать одну строку в Access Folder Access? Моя озабоченность не показывает более одной строки для каждого «Доступ к папке». – CaioVJesus89

+0

То, что я предложил, будет показывать только одну строку в папке. –

+0

Одна проблема. Покажите одну ошибку, чтобы использовать ToList(). Я использую System.Collections.Generic. и System.Linq. В спискеRequest.Email = reader ["Email"]. ToList(); – CaioVJesus89

0

В качестве альтернативы тому, что предложил Джон Крафт, если вы все еще хотите сохранить String вместо списка, что вы можете использовать CSV адресов электронной почты.

String s = "[email protected], [email protected], [email protected]"; 

И затем использовать Regex для разделения (это берет на себя дополнительных пробелов):

foreach(string email in Regex.Split(s, @"\s*[,;]\s*")) 
{ ... } 
+0

Я был с тобой на этом, пока не добрался до регулярного выражения. ;) Адреса электронной почты не могут содержать запятые, afaik, так почему бы просто не использовать строку .Split? –

+0

@JohnKraft Я упоминал почему. Некоторое время пользователи вводят пробелы после запятых (по крайней мере, мои пользователи). – banging

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