虽然Gravatar服务的API(实际上,它实际上只是一个URL)非常简单,但是否有一个简单的帮助程序方法可以很好地反射(reflect)Gravatar的所有可用选项呢?

  • 图像大小
  • 默认图片(用户未指定时)
  • 评分(G/PG/R/X)

  • 理想情况下,这将是HtmlHelper扩展方法。

    我的目标是.NET4上的MVC2,但我想其他人也会对早期版本的选项感兴趣。

    编辑实现也应允许为生成的HTML元素提供其他属性。

    最佳答案

    感谢您的回答。最后,我编写了自己的解决方案,因此我会将其发布在这里,以供其他可能认为有用的人使用。

    如问题所示,它可以满足Gravatar目前支持的所有功能。

    像这样使用它:

    <%= Html.Gravatar(Model.User.EmailAddress) %>
    

    我为任何选项提供了可选参数。这些可以组合。
    // Use a specific image size (the default is 80px)
    Html.Gravatar(Model.User.EmailAddress, size:64)
    
    // Specify what image should appear if the email address is not
    // associated with a Gravatar account
    Html.Gravatar(Model.User.EmailAddress,
                  defaultImage:GravatarDefaultImage.Identicon)
    
    // Specify the maximum rating allowed for images
    Html.Gravatar(Model.User.EmailAddress, rating:GravatarRating.Pg)
    
    // Add any additional HTML attributes for the <img /> tag
    Html.Gravatar(Model.User.EmailAddress,
                  htmlAttributes:new { @class = "gravatar" })
    

    这是代码:
    using System;
    using System.Diagnostics;
    using System.Security.Cryptography;
    using System.Text;
    using System.Web.Mvc;
    using System.Web.Routing;
    
    namespace SampleNamespace
    {
        public static class HtmlHelperGravatar
        {
            /// <summary>
            /// Creates HTML for an <c>img</c> element that presents a Gravatar icon.
            /// </summary>
            /// <param name="html">The <see cref="HtmlHelper"/> upon which this extension method is provided.</param>
            /// <param name="email">The email address used to identify the icon.</param>
            /// <param name="size">An optional parameter that specifies the size of the square image in pixels.</param>
            /// <param name="rating">An optional parameter that specifies the safety level of allowed images.</param>
            /// <param name="defaultImage">An optional parameter that controls what image is displayed for email addresses that don't have associated Gravatar icons.</param>
            /// <param name="htmlAttributes">An optional parameter holding additional attributes to be included on the <c>img</c> element.</param>
            /// <returns>An HTML string of the <c>img</c> element that presents a Gravatar icon.</returns>
            public static string Gravatar(this HtmlHelper html,
                                          string email,
                                          int? size = null,
                                          GravatarRating rating = GravatarRating.Default,
                                          GravatarDefaultImage defaultImage = GravatarDefaultImage.MysteryMan,
                                          object htmlAttributes = null)
            {
                var url = new StringBuilder("//www.gravatar.com/avatar/", 90);
                url.Append(GetEmailHash(email));
    
                var isFirst = true;
                Action<string,string> addParam = (p,v) =>
                    {
                        url.Append(isFirst ? '?' : '&');
                        isFirst = false;
                        url.Append(p);
                        url.Append('=');
                        url.Append(v);
                    };
    
                if (size != null)
                {
                    if (size < 1 || size > 512)
                        throw new ArgumentOutOfRangeException("size", size, "Must be null or between 1 and 512, inclusive.");
                    addParam("s", size.Value.ToString());
                }
    
                if (rating != GravatarRating.Default)
                    addParam("r", rating.ToString().ToLower());
    
                if (defaultImage != GravatarDefaultImage.Default)
                {
                    if (defaultImage==GravatarDefaultImage.Http404)
                        addParam("d", "404");
                    else if (defaultImage==GravatarDefaultImage.Identicon)
                        addParam("d", "identicon");
                    if (defaultImage==GravatarDefaultImage.MonsterId)
                        addParam("d", "monsterid");
                    if (defaultImage==GravatarDefaultImage.MysteryMan)
                        addParam("d", "mm");
                    if (defaultImage==GravatarDefaultImage.Wavatar)
                        addParam("d", "wavatar");
                }
    
                var tag = new TagBuilder("img");
                tag.MergeAttributes(new RouteValueDictionary(htmlAttributes));
                tag.Attributes.Add("src", url.ToString());
    
                if (size!=null)
                {
                    tag.Attributes.Add("width", size.ToString());
                    tag.Attributes.Add("height", size.ToString());
                }
    
                return tag.ToString();
            }
    
            private static string GetEmailHash(string email)
            {
                if (email == null)
                    return new string('0', 32);
    
                email = email.Trim().ToLower();
    
                var emailBytes = Encoding.ASCII.GetBytes(email);
                var hashBytes = new MD5CryptoServiceProvider().ComputeHash(emailBytes);
    
                Debug.Assert(hashBytes.Length == 16);
    
                var hash = new StringBuilder();
                foreach (var b in hashBytes)
                    hash.Append(b.ToString("x2"));
                return hash.ToString();
            }
        }
    
        public enum GravatarRating
        {
            /// <summary>
            /// The default value as specified by the Gravatar service.  That is, no rating value is specified
            /// with the request.  At the time of authoring, the default level was <see cref="G"/>.
            /// </summary>
            Default,
    
            /// <summary>
            /// Suitable for display on all websites with any audience type.  This is the default.
            /// </summary>
            G,
    
            /// <summary>
            /// May contain rude gestures, provocatively dressed individuals, the lesser swear words, or mild violence.
            /// </summary>
            Pg,
    
            /// <summary>
            /// May contain such things as harsh profanity, intense violence, nudity, or hard drug use.
            /// </summary>
            R,
    
            /// <summary>
            /// May contain hardcore sexual imagery or extremely disturbing violence.
            /// </summary>
            X
        }
    
        public enum GravatarDefaultImage
        {
            /// <summary>
            /// The default value image.  That is, the image returned when no specific default value is included
            /// with the request.  At the time of authoring, this image is the Gravatar icon.
            /// </summary>
            Default,
    
            /// <summary>
            /// Do not load any image if none is associated with the email hash, instead return an HTTP 404 (File Not Found) response.
            /// </summary>
            Http404,
    
            /// <summary>
            /// A simple, cartoon-style silhouetted outline of a person (does not vary by email hash).
            /// </summary>
            MysteryMan,
    
            /// <summary>
            /// A geometric pattern based on an email hash.
            /// </summary>
            Identicon,
    
            /// <summary>
            /// A generated 'monster' with different colors, faces, etc.
            /// </summary>
            MonsterId,
    
            /// <summary>
            /// Generated faces with differing features and backgrounds.
            /// </summary>
            Wavatar
        }
    }
    

    09-26 15:14