簡體   English   中英

如何從Mutliple CheckBoxList選擇檢索輸出並將其放置在ASP.Net的電子郵件文本文件中

[英]How Can I Retrieve the Output from Mutliple CheckBoxList Selections & Place in Email Text File in ASP.Net

在我的ASP.Net/C#網站上,我有一個頁面,該頁面充當表單並記錄用戶的信息。 然后,該表格通過“我的App Data文件夾中的格式化文本文件將該信息發送到電子郵件。 所有輸入都顯示在電子郵件中,但是,當我測試選擇多個復選框項時,只會出現一個選擇-這是格式化的文本文件代碼:

Customer Name:     ##CustName##
Phone Number:      ##PhoneNumber##
Service Address:   ##Address##
City/State:        ##lstCitySelect##
ZipCode:           ##ZipCode##

Service Type:      ##ServiceType##
Service Date:      ##ServiceDate##
Service Time:      ##ServiceTime##

這是我用來將所有這些內容處理到電子郵件中的表單的代碼背后:

protected void btnSubmit_Click(object sender, EventArgs e)
{
    if (Page.IsValid)
    {
        string fileName = Server.MapPath("~/App_Data/ScheduleForm.txt");
        string mailBody = File.ReadAllText(fileName);

        mailBody = mailBody.Replace("##CustName##", txtFirstName.Text + " " + txtLastName.Text);            
        mailBody = mailBody.Replace("##PhoneNumber##", txtPhone.Text);
        mailBody = mailBody.Replace("##Address##", txtAddress.Text);
        mailBody = mailBody.Replace("##lstCitySelect##", lstCitySelect.SelectedValue);
        mailBody = mailBody.Replace("##ZipCode##", txtZipCode.Text);
        mailBody = mailBody.Replace("##ServiceType##", chkServiceOption.SelectedValue);
        mailBody = mailBody.Replace("##ServiceDate##", txtDatePopulate.Text);
        mailBody = mailBody.Replace("##ServiceTime##", txtTimePopulate.Text);
        mailBody = mailBody.Replace("##Details##", txtDetails.Text);

        MailMessage myMessage = new MailMessage();
        myMessage.Subject = "Response from web site";
        myMessage.Body = mailBody;

        myMessage.From = new MailAddress("email@myemail.com", "From Sender");
        myMessage.To.Add(new MailAddress("email@myemail.com", "To Recipient"));

        SmtpClient mySmtpClient = new SmtpClient();
        mySmtpClient.Send(myMessage);

        Message.Visible = true;
        FormTable.Visible = false;
    }            
}

我的問題是chkServiceOption CheckBoxList控件未返回電子郵件中所有選中的“復選框”實例。 我找不到可以提取所選值索引的類。 有人可以建議我可以使用或做些什么來實現這一目標嗎? 在提交表單之前,以及在點擊電子郵件之后,我都提供了該表單的屏幕截圖-請注意,僅拉取了一項服務實例

在此處輸入圖片說明在此處輸入圖片說明

文檔中

若要確定CheckBoxList控件中的選定項目,請遍歷Items集合並測試該集合中每個項目的Selected屬性。

因此,您必須執行以下操作:

var services = chkServiceOption.Items.Cast<ListItem>()
                                     .Where(c => c.Selected)
                                     .Select(c => c.Text);

var servicesStr = string.Join(", ", services);

這只是以下循環的LINQ形式:

string ret = "";

foreach(var item in checkbox.items)
{
    if(item.Selected)
    {
        if (ret.Length > 0)
        {
            ret += ", ";
        }

        ret += item.Text;
    }
}

這個想法是,您必須遍歷CheckBoxList中的每個項目,檢查是否已選中它們,然后將它們添加到集合中。 在本示例中,我選擇了一個逗號分隔的字符串作為“收藏”,因為我認為這就是您希望在電子郵件中使用的字符串,但是您也可以看到它也可以是任何其他類型的收藏。

編輯:

這只是解決注釋中的請求以解釋LINQ查詢。

我在這里采取了四個基本步驟。 我將逐一討論。

  1. chkServiceOption.Itemsforeach與LINQ相同。 我想你知道那是哪里來的。
  2. .Cast<ListItem>() :這是我們開始做有趣的事情的地方。 ListItemCollection類僅實現IEnumerable ,而不實現LINQ查詢運行所需的IEnumerable<T> 因此,我們必須將每個元素ListItem轉換為ListItem類型。 在幕后,這基本上只是一個遍歷ListItemCollection並強制轉換每個元素的foreach循環。
  3. .Where(c => c.Selected) :這是我們開始使用LINQ的地方。 現在,我們正在處理IEnumerable<ListItem> ,因此我們可以基於該知識運行查詢。 此處的代碼循環遍歷每個元素,然后僅返回通過謂詞的元素。 在我們的例子中,這意味着它僅返回c.Selected所在的c.Selected ,這只是c.Selected == true的眾所周知的語法快捷方式。
  4. .Select(c => c.Text) :現在,我們只有想要的元素,但是它們仍然都以ListItem類型輸入,這對用戶並不是特別有用。 我們需要每個ListItem的文本(復選框),因此我們遍歷每個項目並選擇Text屬性的值。
  5. string.Join :這也不是真正的LINQ-y,但是基本上現在我們只想在每個元素之間放入一個逗號,以便它更好地類似於人類可讀的列表。

問題是chkServiceType選項可以有多個(或沒有)選定的值,而不僅僅是一個。 當您需要迭代控件的項目集合以查看是否選擇了子項目時,您的代碼正在尋找一個值。 我對此有些生疏,但看起來應該像這樣:

   foreach(var item in checkbox.items)
   {
      if(item.Selected)
      {
          //Do Something
      }
   }
chkServiceOption.Items[0].Selected

chkServiceOption.Items[1].Selected

chkServiceOption.Items[2].Selected

chkServiceOption.Items[0].Text 

檢查調試器中的內容或僅將其附加到電子郵件中,以便您可以看到值...

chkServiceOption.SelectedValue的語義向我暗示,實際上,它指的是一個奇異值,它將解釋您所看到的行為。 您可能需要遍歷CheckBoxList中的項目並測試是否已選中每個項目。 嘗試這樣的事情:

string serviceOptionTxt = "";
for (int i = 0; i < chkServiceOption.Items.Count; i++)
{
    if (chkServiceOption.Items[i].Selected)
        serviceOptionTxt += chkServiceOption.Items[i].Value + " ";
        // Or possibly?
        //serviceOptionTxt += chkServiceOption.Items[i].Text + " ";
    }
}
mailBody = mailBody.Replace("##ServiceType##", serviceOptionTxt);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM