gpt4 book ai didi

.net - 用于访问 Gravatar 图像的 ASP.NET MVC 帮助程序

转载 作者:行者123 更新时间:2023-12-02 03:57:44 24 4
gpt4 key购买 nike

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

关于.net - 用于访问 Gravatar 图像的 ASP.NET MVC 帮助程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3561477/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com