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:
- Pokud není specifikováno DefaultImageUrl, nepřidává se do questy stringu "default=".
- Korektní výpočet plného URL pro DefaultImageUrl.
- Vizuální vlastnosti nastaveny jako skinovatelné