Laden...

ImageResult für ASP.NET MVC

Erstellt von dN!3L vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.951 Views
dN!3L Themenstarter:in
2.891 Beiträge seit 2004
vor 14 Jahren
ImageResult für ASP.NET MVC

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