Dnes jsem aktualizoval Nemesis na nejnovější verzi. Běží pod ASP.NET 3.5, ale pro vás jako čtenáře se nic zásadního nezměnilo. Přibyla jenom podpora technologie Gravatars v komentářích.

Co je Gravatar?

Gravatar je služba, která vám umožní přiřadit ke své e-mailové adrese ikonku, obrázek o rozměru 80x80 px (nebo menší). A když napíšete komentář na server, který tuto službu podporuje, automaticky dokáže tuto ikonku zobrazit.

Web služby a možnost registrace najdete na www.gravatar.com.

Popis implementace najdete na shora uvedeném webu. V zásadě jde o to, že zavoláte URL, kde jako parametr předáte MD5 hash e-mailové adresy a volitelně další parametry, jako požadovaný rozměr obrázku (je čtvercový a maximální délka strany je 80 px) a případně adresu obrázku, který se má zobrazit, pokud k dané e-mailové adrese není zaregistrován žádný avatar.

Jak na něj v ASP.NET?

Jako nejvhodnější řešení jsem zvolil server control, kterému jako parametr dáte e-mailovou adresu a on vyrenderuje element <img> s odpovídajícími parametry:

using System;

using System.ComponentModel;

using System.Web;

using System.Web.Security;

using System.Web.UI;

 

namespace Altairis.Web.UI.WebControls {

    public class Gravatar : Control {

        private const string UrlFormatNoDefault = "http://www.gravatar.com/avatar.php?gravatar_id={0}&size={1}";

        private const string UrlFormatWithDefault = "http://www.gravatar.com/avatar.php?gravatar_id={0}&size={1}&default={2}";

        private const int DefaultSize = 80;

        private const string DefaultAlternateText = "Gravatar";

 

        [Description("E-mail address to display avatar for.")]

        public string EmailAddress {

            get { return (string)this.ViewState["EmailAddress"]; }

            set { this.ViewState["EmailAddress"] = value; }

        }

 

        [Description("Size of square avatar image in pixels.")]

        [DefaultValue(DefaultSize), Themeable(true)]

        public int Size {

            get { return (int)this.ViewState["Size"]; }

            set {

                if (value < 1 || value > 80) throw new ArgumentOutOfRangeException("value", value, "Size must be between 1 and 80 pixels.");

                this.ViewState["Size"] = value;

            }

        }

 

        [Description("Image to be used in case that avatar is not defined for given e-mail address.")]

        [UrlProperty, Themeable(true)]

        public string DefaultImageUrl {

            get { return (string)this.ViewState["DefaultImageUrl"]; }

            set { this.ViewState["DefaultImageUrl"] = value; }

        }

 

        [Description("Alternate text to display for avatar image.")]

        [DefaultValue(DefaultAlternateText), Themeable(true)]

        public string AlternateText {

            get { return (string)this.ViewState["AlternateText"]; }

            set { this.ViewState["AlternateText"] = value; }

        }

 

        protected override void Render(HtmlTextWriter writer) {

            string hash = FormsAuthentication.HashPasswordForStoringInConfigFile(this.EmailAddress, "MD5").ToLower();

            string imageUrl;

 

            if (string.IsNullOrEmpty(this.DefaultImageUrl)) {

                imageUrl = string.Format(UrlFormatNoDefault, hash, this.Size);

            }

            else {

                // Compute real full URL of default image

                var ub = new UriBuilder(this.Context.Request.Url);

                ub.Query = string.Empty;

                ub.Path = this.Page.ResolveUrl(this.DefaultImageUrl);

                string defaultUrl = HttpUtility.UrlEncode(ub.Uri.ToString());

 

                imageUrl = string.Format(UrlFormatWithDefault, hash, this.Size, defaultUrl);

            }

 

            writer.WriteBeginTag("img");

            writer.WriteAttribute("src", imageUrl);

            writer.WriteAttribute("alt", this.AlternateText);

            writer.WriteAttribute("width", string.Format("{0}px", this.Size));

            writer.WriteAttribute("height", string.Format("{0}px", this.Size));

            writer.Write(HtmlTextWriter.SelfClosingTagEnd);

        }

 

    }

}

Úpravy provedené 12. 3. 2008: