NoSpamEmailHyperlink: 5.实现

分享于 

9分钟阅读

Web开发

  繁體

Transformation from ASP.NET to HTML to browser

简介

这是一系列六篇文章中的第五个,遵循完整功能的ASP.NET 自定义控件的设计。开发和实际。

完整的文章列表如下:

这些文章不是对自定义控制开发( 有 700页的网页书几乎没有覆盖它)的全面看法,但它们覆盖了很多基本的基础。

目的是在一个完全可以重用和可以自定义的控制( 与许多虚构的例子相反) 上进行这样的操作。

本文将介绍实现 NoSpamEmailHyperlink 控件的几个简单的Web窗体。 它适用于使用标准. NET 框架控件但不使用自定义控件的用户编写的web窗体。

它至少对 ASP.NET web窗体有基本的了解。

从系列的第一篇文章中可以下载到。

使用NoSpamEmailHyperlink函数

使用drag-and-drop功能( 例如 Visual Studio. NET )的读者可以通过右键单击工具箱,选择添加/删除项目。 单击浏览按钮,然后浏览到下载的DLL。

工作的其余部分是当你将控件拖到页面上时为你完成的。

这些例子描述的below 专门设计用来吸引读者或者没有视觉设计师。

示例 1: static 数据

包含页中的NoSpamEmailHyperlink 与包含任何其他自定义控件一样简单。 只需 register 程序集,然后包含标记。 请记住,你可以使用 WebControl 类提供的任何标准格式设置属性。

<%@Page%><%@RegisterTagPrefix="cpspam"Namespace="CP.WebControls"Assembly="CP.WebControls.NoSpamEmailHyperlink"%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN"><html><head><title>NoSpamEmailHyperlink Example 1</title></head><body><formid="myForm"method="post"runat="server"><cpspam:NoSpamEmailHyperlinkid="NoSpamEmailHyperlink1"runat="server"Email="pdriley@santt.com"ScrambleSeed="181"BackColor="#E0E0E0"Font-Bold="True"> Paul Riley (pdriley@santt.com)
 </cpspam:NoSpamEmailHyperlink></form></body></html>

这将生成以下 HTML:

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN"><html><head><title>NoSpamEmailHyperlink Example 1</title></head><body><formname="myForm"method="post"action="nsehex01.aspx"id="Form1"><inputtype="hidden"name="__VIEWSTATE"value="dDwyMDU4NTgyNDA1Ozs+8SYFCkNptnxci/WjgtV6u5nwN1c="/><aid="NoSpamEmailHyperlink1"href="mailto:WsyhiJc@7kDit.com"style="background-color:#E0E0E0;font-weight:bold;"> Paul Riley (WsyhiJc@7kDit.com)
 </a><!-- ASP.NET standard Javascript here --><scriptlanguage="javascript"><!--
 var NoSpamEmailHyperlink_LinkNames = new Array("NoSpamEmailHyperlink1");
 var NoSpamEmailHyperlink_Seeded = new Array("181");
 // --></script><!-- Control Javascript here --><!-- More ASP.NET Javascript here --></html>

电子邮件地址 pdriley@santt.com 不出现在HTML中,但是有一个完全有效的( 但假的) 电子邮件地址。

A NoSpamEmailHyperlink control in action and a snapshot of the generated HTML

控件JavaScript将在前面的文章中详细讨论: NoSpamEmailHyperlink: 3。电子邮件编码和解码。

本文的目的是说代码设计为使用上面显示的数组识别 NoSpamEmailHyperlink 创建的链接并在每个链接出现的地方解码电子邮件地址。

示例 2: 数据绑定

NoSpamEmailHyperlink 绑定到 DataGrid 或者 DataList 中不再是困难的。 注册的实现方式与示例 1完全相同。 控件本身作为 ItemTemplate的一部分包含在其中,例如:

<asp:datagridid="DataGrid1"runat="server"AutoGenerateColumns="False"CellPadding="2"CellSpacing="3"><AlternatingItemStyleBackColor="#E0E0E0"/><HeaderStyleBackColor="#FFC080"/><Columns><asp:BoundColumnDataField="ID"HeaderText="ID"><HeaderStyleWidth="30px"HorizontalAlign="Right"/><ItemStyleHorizontalAlign="Right"/></asp:BoundColumn><asp:TemplateColumn><HeaderStyleWidth="100px"/><HeaderTemplate> Person
 </HeaderTemplate><ItemTemplate><cpspam:NoSpamEmailHyperlinkid="nseh"runat="server"Email='<%# DataBinder.Eval(Container.DataItem, "Email") %>'ScrambleSeed='<%# DataBinder.Eval(Container.DataItem, "ID") %>'><%# DataBinder.Eval(Container.DataItem, "Name") %> (<%# DataBinder.Eval(Container.DataItem, "Email") %>)
 </cpspam:NoSpamEmailHyperlink></ItemTemplate></asp:TemplateColumn></Columns></asp:datagrid>

Databound NoSpamEmailHyperlink shown in a DataGrid in Visual Studio.NET design mode

控件中的任何属性都可以使用标准的数据绑定块进行数据绑定,如 上面。 只能使用 .Text 内部属性包含多个数据块;所有其他数据块必须完全由一个数据块填充。

上面定义的控件将出现在设计器中,如 Visual Studio。 NET作为文本"数据绑定"的链接,如右侧所示。

尝试使用 上面 示例,使用以下代码作为"代码后面"或者 inline <脚本 runat="服务器"> block,用于生成可以绑定的ArrayList

privatevoid Page_Load(object sender, System.EventArgs e)
{
 ArrayList list = new ArrayList();
 list.Add(new Person(1, "Paul Riley", "pdriley@santt.com"));
 list.Add(new Person(2, "David Duncan-Smythe", "david@duncan-smythe.com"));
 list.Add(new Person(3, "Jim Jones", "jim_jones@britdomain.co.uk"));
 DataGrid1.DataSource = list;
 if (!IsPostBack) this.DataBind();
}
publicclass Person
{
 privateint _id = 0;
 privatestring _name = "";
 privatestring _email = "";
 public Person (int NewID, string NewName, string NewEmail) : base()
 {
 _id = NewID;
 _name = NewName;
 _email = NewEmail;
 }
 publicint ID {
 get { return _id; }
 set { _id = value; }
 }
 publicstring Name {
 get { return _name; }
 set { _name = value; }
 }
 publicstring Email {
 get { return _email; }
 set { _email = value; }
 }
}

A DataGrid incorporating the NoSpamEmailHyperlink and a snapshot of the generated HTML

可以看到,可见页面与你希望显示的页面一样。 但是HTML源(。在"记事本"窗口 behind 中显示浏览器) 没有直接包含任何地址。 仅保留扩展名,以保持地址有效。

解码几个链接所需的JavaScript并不比解码一个链接所需的时间长。 这里的JavaScript和示例 1中的惟一区别是 array 定义。

<script language="javascript">
<!--
 var NoSpamEmailHyperlink_LinkNames = new Array(
 "DataGrid1__ctl2_nseh", "DataGrid1__ctl3_nseh", "DataGrid1__ctl4_nseh");
 var NoSpamEmailHyperlink_Seeded = new Array("1", "2", "3");
 // --></script>

注意,尽管 DataGrid 控件实现 INamingContainer 接口,但是链接仍然有惟一的id,尽管只声明了一次。

方法首先使用 DataGrid ( DataGrid1 )的NAME,然后是行( _ctl# )的NAME,最后是 NoSpamEmailHyperlink ( nseh )的NAME,将它们与下划线连接起来,以使 DataGrid1__ctl#_nseh 变得更为。

结论

无论你是使用drag-and-drop操作还是只使用手工代码,NoSpamEmailHyperlink 都易于实现。

注册到页或者用户控件后,NoSpamEmailHyperlink 实际上与包含普通超链接控件没有区别。 所有的编码由控制类在服务器上处理,所有解码都由JavaScript随控件一起传输。

我们唯一想要做的就是定制控件,并进一步混淆任何电子邮件收集器。 这在本系列的final 文章中介绍: NoSpamEmailHyperlink: 6.自定义插件。


相关文章