10
votes

ASP.NET MVC Helper pour accéder aux images gravatar

Alors que l'API du Service Gravatar (Eh bien, ce n'est vraiment qu'une URL) est assez simple, existe-t-il une simple méthode d'assistance qui fait un bon travail de reflétant toutes les options disponibles pour Gravatar?

  • Taille de l'image
  • Image par défaut (lorsque l'utilisateur n'a pas spécifié One)
  • Note (G / PG / R / X)

    Idéalement, ce serait un HTMLHelper Méthode d'extension.

    Je suis ciblant MVC2 sur .NET4, mais je suppose que d'autres seraient intéressés par des options pour les versions antérieures.

    Modifier Les implémentations doivent permettre de fournir des attributs supplémentaires pour l'élément HTML généré également.


0 commentaires

5 Réponses :


12
votes

J'en avais besoin pour un projet pour que j'ai pris: http: //www.freshclickmedia. COM / Blog / 2008/06 / ASPNET-Gravatar-Control-update-Source-Inclus /

et a transformé en cela: P>

<%= Html.Gravatar("john.e.farrell@gmail.com", true)%>


1 commentaires

Merci pour cela. Si seulement j'étais plus patient - j'ai déjà mis en œuvre ma propre solution (posté comme réponse) ... Un commentaire, l'adresse e-mail doit être coupée avant d'être hachée pour garantir une correspondance numérique. Le format URL a été mis à jour un peu depuis que cette mise en œuvre a été écrite, bien que je suppose que cela n'a pas d'importance car je suis sûr qu'ils sont compatibles à l'envers.



4
votes

L'extension de l'assistante gravatar de ROB conery liée ci-dessous serait un bon début.

Mes aides préférés de ASP.NET MVC

Le code du site: xxx

hths ,
Charles


1 commentaires

Merci Charles. Cette implémentation a un bogue potentiel dans lequel l'adresse e-mail est tenue d'être coupée et inférieure avant d'être hachée. Il n'autorise pas non plus l'ajout d'attributs d'éléments HTML supplémentaires (bien que je n'ai pas mentionné cela dans la question!). Un bon départ cependant, acclamations.



19
votes

Merci pour vos réponses. En fin de compte, j'ai écrit ma propre solution, je vais donc le poster ici pour quelqu'un d'autre qui pourrait le trouver utile.

Il s'adresse à toutes les fonctionnalités Gravatar soutient actuellement, comme indiqué dans la question. P> Utilisez-le comme ceci: P>

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
    }
}


2 commentaires

J'utilise votre code mais je ne peux pas deviner pourquoi cela ne fonctionne pas. J'utilise @ html.gravatar ("Certains_email", 100), mais il génère une sortie de texte brut. Je veux dire que au lieu d'une image générée, je vois le texte suivant: . Qu'est-ce qui ne va pas?


@Laserson, utilisez-vous Razor? Essayez ceci: @ html.raw (html.gravatar (...)) . Dans Classic ASPX, utilisez <% = au lieu de <%: (si je me souviens bien.) Verses correctives de ASP.NET MVC Utilisez le MVCHTMLString classe pour représenter la chaîne HTML codée. Cette ancienne version renvoie une chaîne simple, qui est ensuite échappée dans le XML, ce qui signifie que le XML est rendu dans la page. Le code ci-dessus doit être mis à jour pour renvoyer une instance de mvchtmlstring . Malheureusement, je n'ai pas le temps de le faire pour le moment.



2
votes

Malheureusement, je n'ai pas vu votre question plus tôt ou je vous aurais recommandé d'utiliser ma bibliothèque gravatar.net que j'ai construite pour fournir un wrapper .NET pour toute l'API Gravatar.

Si vous êtes intéressé, consultez ici: http://gravatarnet.codeplex.com/


1 commentaires

Merci pour le lien. Je vérifierai.



-1
votes

Voici une aide d'une étiquette de noyau .NET si quelqu'un est intéressé:

using System.Security.Cryptography;
using System.Text;
using Microsoft.AspNetCore.Razor.TagHelpers;

namespace App.Web.TagHelpers
{
    public class GravatarTagHelper : TagHelper
    {
        public string Id { get; set; }

        public string Email { get; set; }

        public int? Size { get; set; }

        public string Class { get; set; }

        public string Alt { get; set; }

        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            output.TagName = "img";
            if (!string.IsNullOrWhiteSpace(Id))
            {
                output.Attributes.SetAttribute("id", Id);
            }
            output.Attributes.SetAttribute("alt", Alt);
            output.Attributes.SetAttribute("src", GenerateGravatarUrl(Email));
            if (!string.IsNullOrWhiteSpace(Class))
            {
                output.Attributes.SetAttribute("class", GenerateGravatarUrl(Class));
            }
            if (Size.HasValue)
            {
                output.Attributes.SetAttribute("width", Size.ToString());
                output.Attributes.SetAttribute("height", Size.ToString());
            }
        }

        private static string GenerateGravatarUrl(string email)
        {
            var md5 = MD5.Create();
            var encoder = new UTF8Encoding();
            var md5Hash = md5.ComputeHash(encoder.GetBytes(email.Trim().ToLower()));
            var md5String = new StringBuilder(md5Hash.Length * 2);
            foreach (var character in md5Hash)
            {
                md5String.Append(character.ToString("X2"));
            }
            return $"https://www.gravatar.com/avatar/{md5String.ToString().ToLower()}?d=mm";
        }
    }
}


0 commentaires