2

我有几个 ASP.NET MVC3 和 4 个网站。所有站点都使用与图书馆分开的相同资源。资源是 .resx 文件。我想在这些网站内的 html 中使用这些资源中的图像。我之前没有使用 resx 文件,所以不确定使用它们的好方法是什么。我认为我可能会创建一个服务来从正确的资源文件中提供正确的图像,但我想应该有更好的方法。我的问题是使用 resx 文件中的这些图像的好方法是什么,将图像存储在 resx 中可能不是很好?

4

1 回答 1

5

一种简单的方法是向FileStreamResult控制器添加一个动作,它应该根据资源键返回图像。

public FileStreamResult Image(string key)
{
    var bitmap = (Bitmap)Resources.Images.ResourceManager.GetObject(key);
    MemoryStream stream = new MemoryStream();
    bitmap.Save(stream, ImageFormat.Png);
    stream.Seek(0, SeekOrigin.Begin);
    return new FileStreamResult(stream, "image/png");
}

现在您应该可以像这样从您的视图中访问它:

<img src='@Url.Action("Image", "MyController", new { key = "Image1" })' />

另一种方法(只能使用视图来完成)是创建一个 base 64 编码的字符串。

@{
    var stream = new MemoryStream();
    var bitmap = Resources.Images.ResourceManager.GetObject("Image1") as System.Drawing.Bitmap;
    bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
    stream.Seek(0, SeekOrigin.Begin);
    string base64 = Convert.ToBase64String(stream.ToArray());
}

<img src="data:image/gif;base64,@base64" />

实现这一点的一个好方法可能是使用 Razor 助手,以在视图中启用更直接的语法@Html.GetImageFor(Resources.Images.Image1, "alt")

public static MvcHtmlString GetImageFor(this HtmlHelper helper, Bitmap bitmap, string AltText = "")
{
    MemoryStream stream = new MemoryStream();
    bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
    stream.Seek(0, SeekOrigin.Begin);
    string base64 = Convert.ToBase64String(stream.ToArray());

    return new MvcHtmlString(
        string.Format("<img src='data:image/gif;base64,{0}' alt='{1}' />",
            base64, AltText)
    );
}

注意: .ResX 文件上的属性应该设置如下(对于 MVC 项目来说是正常的):

  • 设置CustomToolPublicResXFileCodeGenerator
  • 设置Custom Tool Namespace资源
于 2012-09-21T02:40:41.293 回答