Beschreibung:
Wenn man in einer ActionMethod ein Bild direkt als ActionResult zurückgeben möchte, kann das folgende ImageResult verwendet werden.
public ActionResult GenerateImage(string content)
{
Bitmap bitmap = new Bitmap(500,100);
using (Graphics graphics = Graphics.FromImage(bitmap))
using (Font font = new Font("Arial",12))
graphics.DrawString(content,font,Brushes.Red,0,0);
ImageResult result = new ImageResult()
{
Image = bitmap,
ImageFormat = ImageFormat.Png
};
return result;
}
Im View als URL einfach die Route zur ActionMethod angeben. Oder aber die Erweiterungsmethode benutzen, die unten zusätzlich noch mit angegeben ist:
<%= Html.Image("Home/GenerateImage?content=test") %>
oder
<%= Html.Image<HomeController>(hc => hc.GenerateImage("test"),"Ein Testbild",500,100)) %>
Code:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Web.Mvc;
/// <summary>
/// Klasse um Bildinhalte an die Antwort zu senden.
/// </summary>
public class ImageResult : ActionResult
{
/// <summary>
/// Gibt das Bild, dass zurückgebenen werden soll, an oder legt dieses fest.
/// </summary>
public Image Image { get; set; }
/// <summary>
/// Gibt das Dateiformat des zurückgegebenen Bildes an oder legt dieses fest.
/// </summary>
public ImageFormat ImageFormat { get; set; }
private static Dictionary<ImageFormat,string> formatMap = new Dictionary<ImageFormat,string>()
{
{ ImageFormat.Bmp, "image/bmp" },
{ ImageFormat.Gif, "image/gif" },
{ ImageFormat.Icon, "image/vnd.microsoft.icon" },
{ ImageFormat.Jpeg, "image/Jpeg" },
{ ImageFormat.Png, "image/png" },
{ ImageFormat.Tiff, "image/tiff" },
{ ImageFormat.Wmf, "image/wmf" }
};
/// <summary>
/// Verarbeitet das Ergebnis einer ActionMethod
/// </summary>
/// <param name="context">der Kontext, in dem das Ergebnis verarbeitet werden soll</param>
public override void ExecuteResult(ControllerContext context)
{
if (this.Image == null)
throw new ArgumentNullException("Image");
if (this.ImageFormat == null)
throw new ArgumentNullException("ImageFormat");
// Content-Type festlegen
context.HttpContext.Response.Clear();
context.HttpContext.Response.ContentType = ImageResult.formatMap[this.ImageFormat];
// Bildinhalt in die Response schreiben (ohne Umweg mit MemoryStream gibt's eine Exception)
MemoryStream memoryStream = new MemoryStream();
this.Image.Save(memoryStream,this.ImageFormat);
memoryStream.WriteTo(context.HttpContext.Response.OutputStream);
}
}
Erweiterungsmethoden für den HtmlHelper zum einfachen Erzeugen des HTML-Codes für ein Bild:
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Web.Mvc;
using System.Web.Routing;
using Microsoft.Web.Mvc;
using Microsoft.Web.Mvc.Internal;
public static partial class HtmlHelperImageExtensions
{
/// <summary>
/// Erzeugt HTML-Code für die Anzeige eines Bildes
/// </summary>
/// <typeparam name="TController">der Typ des Controllers</typeparam>
/// <param name="helper">der HtmlHelper</param>
/// <param name="action">die Action-Methode</param>
/// <param name="text">der Beschreibungstext des Bildes</param>
/// <param name="htmlAttributes">Attribute, die der erzeugte HTML-Code erhalten soll</param>
/// <returns>HTML-Code für die Anzeige eines Bildes</returns>
public static string Image<TController>(this HtmlHelper helper,Expression<Action<TController>> action,string text,object htmlAttributes) where TController : Controller
{
return HtmlHelperImageExtensions.Image (helper,ExpressionHelper.GetRouteValuesFromExpression (action),text,htmlAttributes);
}
/// <summary>
/// Erzeugt HTML-Code für die Anzeige eines Bildes
/// </summary>
/// <typeparam name="TController"></typeparam>
/// <param name="helper">der HtmlHelper</param>
/// <param name="action">der Typ des Controllers</param>
/// <param name="text">die Action-Methode</param>
/// <param name="width">die Höhe des Bildes</param>
/// <param name="height">die Breite des Bildes</param>
/// <returns>HTML-Code für die Anzeige eines Bildes</returns>
public static string Image<TController>(this HtmlHelper helper,Expression<Action<TController>> action,string text,int width,int height) where TController : Controller
{
string url = new UrlHelper(helper.ViewContext.RequestContext).Action (null,ExpressionHelper.GetRouteValuesFromExpression (action));
return helper.Image(url,text,new Dictionary<string,object> { { "width",width+"px" },{ "height",height+"px" } });
}
/// <summary>
/// Erzeugt HTML-Code für die Anzeige eines Bildes
/// </summary>
/// <param name="helper">der HtmlHelper</param>
/// <param name="routeValueDictionary">Infos zur Route der Action-Methode</param>
/// <param name="text">der Beschreibungstext des Bildes</param>
/// <param name="htmlAttributes">Attribute, die der erzeugte HTML-Code erhalten soll</param>
/// <returns>HTML-Code für die Anzeige eines Bildes</returns>
public static string Image(this HtmlHelper helper,RouteValueDictionary routeValueDictionary,string text,object htmlAttributes)
{
string url = new UrlHelper(helper.ViewContext.RequestContext).Action(null,routeValueDictionary);
return helper.Image(url,text,htmlAttributes);
}
}
Schlagwörter: ASP.NET MVC, Image, Bitmap, ActionResult