自配置表单邮件网络控件

分享于 

11分钟阅读

Web开发

  繁體

介绍

本文描述了一个Web控件 FormMailer,它放置在一个ASPX表单上,将它转换成用户反馈表单。 FormMailer 具有以下功能:

  • 将电子邮件功能添加到表单中只是为了将它的添加到表单中。
  • 任何邮件头都可以添加到发送到 FormMailer 用户控件标签正文的电子邮件中。
  • 显示提交按钮或者链接。
  • 单击按钮后,FormMailer 将收集输入到ASP控件的TextBox 中的值,组成电子邮件并将它的发送给属性。
  • 发送电子邮件后,将重新显示表单,通知用户提交表单的确认消息。

FormMailer 是一种高度可以重用且易于使用的控件,因为它能够自动从表单中收集需要的信息,并将它的转换为"emailable"表单。

背景

这里介绍的FormMailer 控件是自配置对象的一个示例。 除了讨论 FormMailer的细节外,我还想介绍一下自配置。 我首先将自己配置对象的概念当作一个of程序员,但是 ASP.NET 是一个优秀的技术。 自我配置对象是一个GUI或者一些非视觉组件,理想地知道如何思考。 在某种意义上,自我配置类似于面向对象的概念,这说明事物可以具有不同的含义。 多态性通常表现为某些OO语言特性,比如采用不同类型参数的函数。

自我配置对象并不特别依赖于任何面向对象语言特性,但是只能查看它们的上下文。 构建自配置对象的主要原则是,可以由给定环境派生的任何知识都应该从该环境派生,而不是从其他地方复制,如传递的参数。 对于 FormMailer 中的特定示例,请查看 兴趣点 部分。

使用代码

在项目中的某个位置包含 FormMailer.cs 之后,使用要发送的文本框字段创建一个Web窗体。 字段应该是表单级别控件的顶部,也就是说,没有嵌套在任何它的他服务器端标记中。 使用如下所示的标记来对控件进行:

<%@ Register TagPrefix="uc" NameSpace="YWLib.Utility.Controls.FormProcessing" Assembly="FormMailerDemo" %>

最后,将 FormMailer 标记放置在窗体上。 下面的代码 block 是一个示例 FormMailer 标记。 FormMailer 标记显示一个提交按钮,因此应该相应地放置它。 可以在本文的代码下载中找到完整表单页面的示例。

<uc:FormMailerid="FormMailer"runat="server"ControlToShowOnSuccess="SuccessPanel"SmtpServer="localhost"ControlToHideOnSuccess="InstructionsPanel"><asp:Buttonid="SubmitControl"runat="server"text="Send Message"></asp:Button><MailTemplate> ---#Name#---
 #Text#</MailTemplate><MailHeaderName="From"Text="formmailer@yourdomain.com"/><MailHeaderName="To"Text="webmaster@yourdomain.com"/></uc:FormMailer>

可以看到代码 上面 中的FormMailer 标签包含一些属性( 标记属性)。一个嵌入式 asp:Button 标记。一个 MailTemplate 标记和一些 MailHeader 标记。

asp:Button 标记,只是一个常规的ASP按钮控件,但它存在于 FormMailer 中。 在加载时,FormMailer 控件查找在它的主体文本中提供的ASP按钮,并自动将它的click事件绑定到提交和邮件。 FormMailer 控件还接受 asp:LinkButton 或者 asp:ImageButton,以代替 asp:Button

MailTemplate 标签用于格式化每个被发邮件的字段。 FormMailer 将字段的ID替换为 #Name# 标记,并将值替换为 #Text# 标记。 例如如果表单包含这两个文本字段,

<asp:textbox id="Name" runat="server"></asp:textbox>

<asp:textbox id="Email" runat="server"></asp:textbox> ,

示例 FormMailer 上面 发送的电子邮件,将如下所示:

---Name----

主页

---Email----

johng@somedomain.com

请注意,与HTML不同,MailTemplate 标记中的空白会影响格式。 另外,MailTemplate 标记是可选的,如果没有,FormMailer 也会使用默认格式。

通过 MailHeader 标签,你可以向发送的邮件中添加任何邮件 header。 只需将header的名称放入 Name 属性,然后将header的值放入 Text 属性中。 还可以通过将属性的MailHeaderTextFromTextBox 设置为控件的ID,从 TextBox 控件中分配 header的值。 如果指定了 TextTextFromTextBox 属性,则如果文本框为空,则 Text 将用作默认值。 最重要的header 是 header,它指定表单的收件人。 作为方便,邮件标题主题和回复to自动添加到电子邮件 from"主题"和"合作伙伴地址"( 区分大小写)的文本框中自动添加。 从电子邮件主体中省略主题文本框内容,因这里仅作为电子邮件主题显示。

以下是 FormMailer 控件属性:

  • ControlToShowOnSuccess - 在加载表单后,在窗体被发送后将隐藏它的与这里属性匹配的控件。 控件不能嵌套在任何其他控件内,也不能在 FormMailer 中找到。
  • ControlToHideOnSuccess - 类似于 ControlToShowOnSuccess,只是在发送电子邮件后控件是隐藏的。
  • DontMailPrefix - 如果设置了这里属性,FormMailer 将不会发送of字符串以这里属性值开始的表单控件的TextBox
  • DisableFieldsAfterSend - 如果设置为 true,则在发送电子邮件后禁用表单和提交按钮的字段。 这与与 ControlToShowOnSuccess 使用的标签控件相结合,可以说明"感谢"发送给我们的"感谢。 下面是你发送的信息。用户随后看到相同的表单,但有不可编辑的字段。 这里属性的默认值为 true
  • SmtpServer - 将这里属性设置为你的SMTP服务器的名称。 默认值为"localhost"。

FormMailer 还包含一个名为 MailSent的事件,该事件在发送邮件后被激发。 如果你想在发送电子邮件后执行代码,比如 将重定向到不同的页面。

最后,FormMailer 只支持寄存在表单上的TextBox 控件的内容,而它的余的则被忽略。

Points of Interest

让我们看一下 FormMailer的核心部分,负责实际邮寄表单的函数。 其余代码还包括许多有趣的点,但它们主要属于构建自定义控件的一般类别。 也许我将来会在代码中详细说明那部分代码。

这里函数名为 MailTheForm(),它直接从按钮事件的单击中调用。 完整的清单是在可以下载的代码中。

第一个任务 MailTheForm 是查找页面控件的HtmlForm,以及它所包装的控件。

HtmlForm formControl = GetFormControl(Page);
ControlCollection controlsToMail = formControl.Controls;

这看起来很简单,但是这是自定义配置哲学的一个重要部分。 FormMailer 也可以设计为接受某种类型的控件的to列表。 而是 FormMailer 找到自己需要处理的控件。

GetFormControl() 是一个 helper 函数,它查找页面控件的HtmlForm。 它包含一个简单的循环:

foreach (Control control in page.Controls)
{ 
 if (control is HtmlForm)
 {
 return (HtmlForm)control;
 }
}returnnull; 

然后 MailTheForm() 遍历所有表单控件,并处理如下文本框:

if (control is TextBox)
{
 TextBox textBox = (TextBox)control;
 if (textBox.Text.Length >0)
 {
 if (textBox.ID.ToLower().EndsWith("subject"))
 {
 subject = textBox.Text; // subject is added as a mail header // later in the code }
 elseif (textBox.ID.ToLower().EndsWith("emailaddress"))
 {
 replyTo = textBox.Text; // add a reply-to header, and// append the to the text of the message  messageText.Append(mailTemplate.getTemplateText(textBox.ID, 
 textBox.Text));
 }
 else { 
 messageText.Append(mailTemplate.getTemplateText(textBox.ID, 
 textBox.Text));
 }
 }
} 

注意第一个 if,排除了不是文本框的所有控件。 为了增强 FormMailer 处理其他类型控件的能力,只需在 else if 子句中包含它们。 textMessage 是一个用来构成电子邮件正文字符串的StringBuilderMailTemplate 是一个 MailTemplate 类型对象。 MailTemplate 类负责格式化附加到电子邮件正文中的文本。

结束语

FormMailer 设计为以最少数量的配置启用表单,这是 ASP.NET.的可以重用性和分区能力的好例子。

本文主要介绍了 FormMailer的使用。 对于希望进入代码的读者,我尝试在源中包含合理的评论量。


WEB  控制  for  form  mail  SELF  
相关文章