Code and more

ICommentable Blog

HowTo: Gravatar Helper für ASP.NET MVC

Hinterlasse einen Kommentar »

Gravatar ist ein öffentlicher und kostenloser Webdienst der die Verknüpfung eines Profilbildes oder auch Avatars mit einer Email-Adresse ermöglicht. Gravatar stellt somit einen Art globalen Avatar bereit.

Die Einbindung in eigene Seiten ist denkbar simpel.

To request a gravatar from our servers, you simply add an image to your users activity with an "src" attribute that points to our gravatar image generator and includes an MD5 hash of the user’s email address. Since all gravatars are rated with an MPAA style rating, you can restrict your site to show only gravatars whose content you are comfortable with. Quelle: http://en.gravatar.com

Für ASP.NET MVC basierte Projekte bietet es sich an, die Einbindung über einen eigenen HtmlHelper zu realisieren. Zunächst habe ich eine Klasse GravatarViewHelper in meinen MVC Projekt angelegt.

gravatarclass

Als nächstes werden nun die eigentlichen Extension Methoden definiert.

public static string GravatarLink(this HtmlHelper html, string id, 
                                  string alternateText, string email, 
                                  int size, string rating)
{
    return GravatarLink(html, id, alternateText, email, size, rating, null);
}

public static string GravatarLink(this HtmlHelper html, string id, 
                                  string alternateText, string email, 
                                  int size, string rating, object htmlAttributes)
{
    if (String.IsNullOrEmpty(email))
        return String.Empty;

    var url = BuildGravatarUrl(email, size, rating);
    var tag = BuildTag(id, url, htmlAttributes, alternateText);

    return tag;
}

 

Ziel der Methoden ist es ein <img> Tag zu rendern, dessen “src” Attribut die generierte Gravatar URL enthält. Das Erstellen der Gravatar URL erfolgt in 3 Schritten:

1. Zusammenbauen der Basis URL

2. Erzeugen des MD5 Hash aus der Email Adresse

3. Hinzufügen von Gravatar Optionen (Bildgröße, Rating)

private static string BuildGravatarUrl(string email, int size, string rating)
{
    var builder = new UriBuilder("http://www.gravatar.com/");
    builder.Path = "avatar/";
    builder.Path = builder.Path + CreateEmailMd5Hash(email);

    AppendQueryToGravatarUri(builder, "s="+size);
    AppendQueryToGravatarUri(builder, "r=" + rating);
    AppendQueryToGravatarUri(builder, "d=identicon");

    return builder.ToString();
}

Abschließend muss noch das img Tag erzeugt werden.

private static string BuildTag(string id, string url, 
                               object htmlAttributes, 
                               string alternateText)
{
    var builder = new TagBuilder("img");
    builder.GenerateId(id);
    builder.MergeAttribute("src", url);
    builder.MergeAttribute("alt", alternateText);
    builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));

    return builder.ToString(TagRenderMode.SelfClosing);
}

Nun noch schnell im View ein Import Statement für den neuen HtmlHelper hinzufügen und fertig.

%@Import Namespace="Chessman.Mvc.Helper"%

<%
    foreach (var user in Model)
    {
%>
       <%= Html.GravatarLink("myGravatar", "Gravatar Image", user.Email, 80, "PG") %>
    
<% 
    } 
%>

 

Hier nochmal der komplette Code der GravatarViewHelper Klasse:

public static class GravatarViewHelper
{
    public static string GravatarLink(this HtmlHelper html, string id, 
                                      string alternateText, string email, 
                                      int size, string rating)
    {
        return GravatarLink(html, id, alternateText, email, size, rating, null);
    }

    public static string GravatarLink(this HtmlHelper html, string id, 
                                      string alternateText, string email, 
                                      int size, string rating, object htmlAttributes)
    {
        if (String.IsNullOrEmpty(email))
            return String.Empty;

        var url = BuildGravatarUrl(email, size, rating);
        var tag = BuildTag(id, url, htmlAttributes, alternateText);

        return tag;
    }

    private static string BuildGravatarUrl(string email, int size, string rating)
    {
        var builder = new UriBuilder("http://www.gravatar.com/");
        builder.Path = "avatar/";
        builder.Path = builder.Path + CreateEmailMd5Hash(email);

        AppendQueryToGravatarUri(builder, "s="+size);
        AppendQueryToGravatarUri(builder, "r=" + rating);
        AppendQueryToGravatarUri(builder, "d=identicon");

        return builder.ToString();
    }

    private static void AppendQueryToGravatarUri(UriBuilder builder, string query)
    {
        if (builder.Query != null && builder.Query.Length > 1)
            builder.Query = builder.Query.Substring(1) + "&" + query;
        else
            builder.Query = query;
    }

    private static string CreateEmailMd5Hash(string email)
    {
        var provider = new MD5CryptoServiceProvider();
        var bytesToHash = Encoding.UTF8.GetBytes(email);
        bytesToHash = provider.ComputeHash(bytesToHash);

        var result = String.Empty;
        foreach (var b in bytesToHash)
        {
            result = (result + b.ToString("x2"));
        }

        return result;
    }

    private static string BuildTag(string id, string url, object htmlAttributes, 
                                   string alternateText)
    {
        var builder = new TagBuilder("img");
        builder.GenerateId(id);
        builder.MergeAttribute("src", url);
        builder.MergeAttribute("alt", alternateText);
        builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));

        return builder.ToString(TagRenderMode.SelfClosing);
    }
}


Geschrieben von Herr W.

Mai 16, 2009 um 8:25

Veröffentlicht in Code

Verschlagwortet mit ,

Eine Antwort schreiben