如何利用MVC中的常见图像资源

Fel*_*lix 2 asp.net-mvc resx embedded-resource asp.net-mvc-3 asp.net-mvc-4

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

McG*_*gle 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");
}
Run Code Online (Sandbox Code Playgroud)

现在您应该能够从您的视图中访问它,如下所示:

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

另一种方法(可以仅使用视图完成)是创建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" />
Run Code Online (Sandbox Code Playgroud)

实现这一点的好方法可能是使用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)
    );
}
Run Code Online (Sandbox Code Playgroud)

注意: .ResX文件的属性应设置如下(与MVC项目一样):

  • 设置CustomToolPublicResXFileCodeGenerator
  • 设置Custom Tool Namespace资源