После статьи «Защита email с помощью Javascript и ASP.NET »

решил написать полноценный серверный WebControl, позволяющий автоматизированно защищать адреса электронной почты на странице. Использовать его очень просто:

  <pb:AntiSpamControl Email="myemail@gmail.com" runat="server"/>

В результате, получим email: myemail@gmail.com, сконструированный с помощью JavaScript. Результирующая html-страница будет содержать в разметке тэг anchor, наподобие следующего:

	‹a id="ctl02" id="ctl02"›‹/a›

и код JavaScript в конце страницы

‹script type="text/javascript"›
//‹![CDATA[
(function(id){
var v12='l.',v16='m',v10='ai',v8='gm',v4='ai',v2='em',v0='my',v6='l@',v14='co',result=v0+v2+v4+v6+v8+v10+v12+v14+v16;
document.getElementById(id).href = 'mailto:' + result;
document.getElementById(id).innerHTML = result;
})('ctl02');
//]]›
‹/script›

Исходный код контрола:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
using System.Text;

namespace ProgBlog.Controls
{
    public class AntiSpamControl : WebControl
    {
        public string Email { get; set; }

        public AntiSpamControl()
        {
        }

        public override void RenderBeginTag(System.Web.UI.HtmlTextWriter writer)
        {
        }

        public override void RenderEndTag(System.Web.UI.HtmlTextWriter writer)
        {
        }

        static readonly Random _random = new Random();

        protected override void OnLoad(EventArgs e)
        {
            if (Email == null)
                throw new ArgumentNullException("Email");
            if (Email.Length == 0)
                throw new ArgumentException("Email is empty");

            StringBuilder sb = new StringBuilder();
            var vars = string.Empty;
            List‹string› arr = new List‹string›(Email.Length);
            for (int i = 0; i ‹= Email.Length; i += 2)
            {
                var _var = "v" + i;
                arr.Add(_var + "='" + Email.Substring(i, (i + 2 ‹ Email.Length ? 2 : Email.Length - i)) + "'");
                vars += (vars == string.Empty ? "" : "+") + _var;
            }

            for (int i = 0; i ‹ arr.Count; i++)
            {
                var index = _random.Next(arr.Count);
                var item = arr[index];
                arr.RemoveAt(index);
                arr.Insert(0, item);
            }

            sb.AppendLine("(function(id){");
            sb.AppendLine("var " + string.Join(",", arr.ToArray()) + ",result=" + vars + ";");
            sb.AppendLine("document.getElementById(id).href = 'mailto:' + result;");
            sb.AppendLine("document.getElementById(id).innerHTML = result;");
            sb.AppendLine("})('" + ClientID + "');");

            if (!this.Page.ClientScript.IsStartupScriptRegistered(this.ClientID.ToString()))
                this.Page.ClientScript.RegisterStartupScript(this.Page.GetType(), this.ClientID.ToString(),
                    sb.ToString(), true);
        }

        protected override void RenderContents(System.Web.UI.HtmlTextWriter writer)
        {
            this.AddAttributesToRender(writer);
            writer.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Id, this.ClientID);
            writer.RenderBeginTag(System.Web.UI.HtmlTextWriterTag.A);
            writer.RenderEndTag();
        }
    }
}

Visual Studio 2008 SolutionСкачать проект (19 кб.)