加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

用于访问Gravatar图像的ASP.NET MVC帮助器

发布时间:2020-12-15 20:10:47 所属栏目:asp.Net 来源:网络整理
导读:虽然Gravatar服务的API(好吧,它只是一个URL)是非常简单的,是否有一个简单的帮助方法,这是一个很好的反映Gravatar可用的所有选项? 图像大小 默认图像(用户未指定时) 评级(G / PG / R / X) 理想情况下,这将是一个HtmlHelper扩展方法. 我在.NET4上定位MVC2,但
虽然Gravatar服务的API(好吧,它只是一个URL)是非常简单的,是否有一个简单的帮助方法,这是一个很好的反映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
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读