2013-07-15 73 views
1

我有一个页面“文件夹访问”和一个CheckBox发送电子邮件列表c#

今天,在我的.cs,每个checkbox这个文件夹访问检查,我发电子邮件到这个文件夹的所有者。 为了得到这封电子邮件,我在我的页面中创建了一个HiddenField to Email。

但是,现在,我为每个文件夹拥有多个所有者。如果它继续这样,我有重复的行。 如何获得每个文件夹的电子邮件列表?

.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来发送电子邮件,它会继续向文件夹访问显示一行?我的首要任务是不要向每个“文件夹访问”显示多行。 – CaioVJesus89

+0

我建议的方式仍然只显示每个文件夹一行。 –

+0

一个问题。显示一个错误以使用ToList()。我正在使用System.Collections.Generic。和System.Linq。在listRequest.Email = reader [“Email”]。ToList(); – CaioVJesus89

0

或者什么约翰·克拉夫特建议,如果你仍然想保持String不是List的,是可以使用的电子邮件地址的CSV。

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

然后用正则表达式来拆分(这需要照顾多余的空格):

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

我一直和你在一起,直到你得到正则表达式。 ;)电子邮件地址不能包含逗号,afaik,那么为什么不只是使用一个字符串。分裂? –

+0

@JohnKraft我确实提到了为什么。有些时候用户在逗号后输入空格(至少我的用户是这样做的)。 – banging