.NET Tip #23: Gravatary pro ASP.NET MVC

Tomáš Jecha, MVP, MCSD       24.12.2008       C#, ASP.NET/IIS, .NET Tips       10652 zobrazení

Gravatar je online služba, která po registraci uživatele dovolí poskytnutí jeho avataru všem v internetu.  O tom ale už psal například Altair na svém webu ASPNET.cz, kde uvádí i implementaci v podobě ovládacího prvku. Bohužel nefunguje v MVC, protože využívá ViewState a nedpodporuje získání adresy z komponenty a rating obsahu. Proto jsem si napsal vlastní.

Její plný zápis je následující (ale až na email jsou všechny položky nepovinné):

<rw:Gravatar ID="Gravatar1" runat="server"
    Email="[email protected]"
    Rating="g1Rated"
    Size="80"
    AltText="Gravater uživatele"
    DefaultImageUrl="http://localhost:29921/Content/A_MAIN~1.JPG"
    />

Dokumentace je přímo v kódu.

Výhodou je, že pokud si objekt vytvoříte v paměti, je možné si nechat vygenerovat adresu k obrázku avataru funkcí GenerateGravatarUrl().

Kód komponenty:

using System.Web;
using System.Web.UI;
using System.Text;

namespace Redwood.Plugin.Mvc.Controls
{
    /// <summary>
    /// Ovládací prvek pro zobrazování Gravatarů
    /// </summary>
    [ToolboxData("<{0}:Gravatar runat=\"server\" Email=\"[email protected]\" size=\"60\" />")]
    public class Gravatar : Control
    {
        #region Private

        private int size = 60;
        private string email;
        private ImageRating rating = ImageRating.pg2Rated;
        private string defaultImageUrl;
        private string altText;

        #endregion

        #region Properties

        /// <summary>
        /// Vrací nebo nastavuje email, podle kterého se bude Gravatar vybírat.
        /// Tato informace se nedostane na klientský prohlížeč.
        /// </summary>
        public string Email { get { return email; } set { email = value; } }

        /// <summary>
        /// Vrací nebo nastavuje velikost obrázku v pixelech.
        /// Platný rozsah je 1 až 512 pixelů.
        /// </summary>
        public int Size
        {
            get
            {
                return size;
            } 
            set
            {
                if (value > 512)
                    value = 512;

                if (value < 1)
                    value = 1;

                size = value;
            }
        }

        /// <summary>
        /// Vrací nebo nastavuje alternativní text obrázku.
        /// </summary>
        public string AltText { get { return altText; } set { altText = value; } }

        /// <summary>
        /// Vrací nebo nastavuje dovolené hodnocení obrázků.
        /// Defaultně to je PG, tedy druhá nejvyšší úroveň regulující nevhodný obsah.
        /// </summary>
        public ImageRating Rating { get { return rating; } set { rating = value; } }

        /// <summary>
        /// Vrací nebo nastavuje adresu obrázku, který se zobrazí, pokud Gravatar není nalezen nebo povolen.
        /// Může být buď prázdná nebo musí obsahovat plnou adresu začínající http://, či https://.
        /// </summary>
        public string DefaultImageUrl { get { return defaultImageUrl; } set { defaultImageUrl = value; } }

        #endregion

        #region Overrides

        protected override void Render(HtmlTextWriter writer)
        {
            writer.WriteBeginTag("img");

            // url gravataru
            writer.WriteAttribute("src", GenerateGravatarUrl());

            // alternativní text obrázku
            if (!string.IsNullOrEmpty(AltText))
            {
                writer.WriteAttribute("alt", AltText);
            }

            // fixní velikost
            writer.WriteAttribute("style",string.Format("width:{0}px; height:{0}px;",Size));
        
            writer.Write(HtmlTextWriter.SelfClosingTagEnd);
        }

        #endregion

        #region Methods

        /// <summary>
        /// Generuje url s odkazem na obrázek gravaturu podle nastavení komponenty.
        /// </summary>
        public string GenerateGravatarUrl()
        {
            StringBuilder sb = new StringBuilder();

            sb.Append("http://www.gravatar.com/avatar/");

            // odkaz na email
            sb.Append(ComputeEmailHash(Email));
            
            // velikost
            sb.Append(".jpg?s=");
            sb.Append(Size);
        
            // rating
            switch (Rating)
            {
                case ImageRating.g1Rated:
                    sb.Append("&r=g");
                 break;
                case ImageRating.pg2Rated:
                    sb.Append("&r=pg");
                 break;
                case ImageRating.r3Rated:
                    sb.Append("&r=r");
                 break;
                case ImageRating.x4Rated:
                    sb.Append("&r=x");
                 break;
            }

            // defaultni obrazek
            if(!string.IsNullOrEmpty(DefaultImageUrl))
            {
                sb.Append("&d=");
                sb.Append(Context.Server.UrlEncode(defaultImageUrl));
            }

            return sb.ToString();
        }

        /// <summary>
        /// Spočítá MD5 hash pro odkaz na gravatar
        /// </summary>
        /// <param name="email">Email</param>
        /// <returns>Vrací 32 znakový řetězec v HEXA formátu</returns>
        public static string ComputeEmailHash(string email)
        {
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(email.ToLower().Trim());
            var md5 = System.Security.Cryptography.MD5.Create();
            buffer = md5.ComputeHash(buffer);

            var retVal = new System.Text.StringBuilder();
            foreach (byte b in buffer)
            {
                retVal.Append(b.ToString("x2").ToLower());
            }
            return retVal.ToString();
        }

        #endregion 

        #region Nested enums

        public enum ImageRating
        {
            /// <summary>
            /// A G rated gravatar is suitable for display on all websites with any audience type. 
            /// </summary>
            g1Rated,

            /// <summary>
            /// PG rated gravatars may contain rude gestures, provocatively dressed individuals, the lesser swear words, or mild violence. 
            /// </summary>
            pg2Rated,

            /// <summary>
            /// R rated gravatars may contain such things as harsh profanity, intense violence, nudity, or hard drug use. 
            /// </summary>
            r3Rated,

            /// <summary>
            /// X rated gravatars may contain hardcore sexual imagery or extremely disturbing violence. 
            /// </summary>
            x4Rated
        }

        #endregion
    }
}

 

hodnocení článku

2 bodů / 2 hlasů       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Diskuse: .NET Tip #23: Gravatary pro ASP.NET MVC

To je taky dilema - používat v ASP.NET MVC Controls nevyužívající ViewState a post-back nebo jít cestou extension methods pro HtmlHelper...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No extension metody HtmlHelperu využivat jen na nejjednodušší drobnosti. Zapisovat nastavení parametrama metody jde, dokud jich je méně než 5. Pak si vzpomenete, že potřebujete další a další a stává se z toho nepřehledný bastl. Navíc možnost předat model MVC Controlu je super.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No mně jsou hlavně Controls sympatičtější, protože když na všechno postavené na nich, tak se dá používat designer... Ale šikla by se podpora pro toto ze strany MS - aby aspoň dodávat základní komponenty přizpůsobený pro MVC. Ale jak se vyjádřil jeden z členů ASP.NET MVC, zatím se s ničím takovým nepočítá :(

Jak předáváš Model do Controly?

Btw. bych zrušil ten IF u zápisu altu. ALT je IMHO povinný atribut.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jo Tys psal předat Model MVC Controlu - tak to jo. Pokud je Control odděděný od System.Web.MVC.ViewUserControl, tak se Model může předat jednoduše při renderu pomocí RenderPartial.

Ale pokud dědíme od System.Web.UI.Control, tak nám asi nezbývá, než přetypovat Page na ViewPage a z té si přečíst Model. Nebo to jde i nějak čistěji?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já vždycky dědím z ViewUserControlu, takže s tímhle problémy nemám.

Pokud by se dědilo přímo, pak jinej způsob než přetipování asi není.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

ALT je sice povinný atribut, ale bez něj to taky jde, takže do toho nikoho nutit nechci :).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No já jen kvůli validitě výsledného HTML :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No, validita je hezká věc, ale pro mě až jedna z těch posledních na které u webu koukám. Pro mě je důležité co na webu je, jak je uspořádaný a jestli se zobrazí tak, abych neměl problémy ho používat. Prohlížeče nevalidní weby zobrazovat umí a dokud to tak bude, tak si s tím lámat hlavu nebudu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jasný, já validitu taky moc neřeším. Jen mě tohle praštilo do oka, protože zvalidnění Tvého generovaného kódu je triviální a dokonce vede na zjednodušení kódu - tak proč se bránit ;-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback