Dot-Net
用於訪問 Gravatar 圖像的 ASP.NET MVC 助手
雖然 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 } }