Sie können die Diagrammsteuerelemente auf zwei Arten verwenden:
Generieren des Images von einem Controller
Durch Generieren des Diagramms und Zurückgeben als Bild aus einer Aktion (wie Chatuman meiner Meinung nach meint):
Chart chart = new Chart();
chart.BackColor = Color.Transparent;
chart.Width = Unit.Pixel(250);
chart.Height = Unit.Pixel(100);
Series series1 = new Series("Series1");
series1.ChartArea = "ca1";
series1.ChartType = SeriesChartType.Pie;
series1.Font = new Font("Verdana", 8.25f, FontStyle.Regular);
series1.Points.Add(new DataPoint {
AxisLabel = "Value1", YValues = new double[] { value1 } });
series1.Points.Add(new DataPoint {
AxisLabel = "Value2", YValues = new double[] { value2 } });
chart.Series.Add(series1);
ChartArea ca1 = new ChartArea("ca1");
ca1.BackColor = Color.Transparent;
chart.ChartAreas.Add(ca1);
using (var ms = new MemoryStream())
{
chart.SaveImage(ms, ChartImageFormat.Png);
ms.Seek(0, SeekOrigin.Begin);
return File(ms.ToArray(), "image/png", "mychart.png");
}
WebForms-Stil
Auf diese Weise fügen Sie das Diagramm einfach in Ihre ASPX-Ansichten ein (genau wie bei herkömmlichen Webformularen). Dazu müssen Sie die relevanten Bits in Ihrer web.config einbinden
<controls>
...
<add tagPrefix="asp"
namespace="System.Web.UI.DataVisualization.Charting"
assembly="System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</controls>
<httpHandlers>
...
<add path="ChartImg.axd"
verb="GET,HEAD"
validate="false"
type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</httpHandlers>
<handlers>
...
<add name="ChartImageHandler"
preCondition="integratedMode"
verb="GET,HEAD"
path="ChartImg.axd"
type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</handlers>
Sie können beim Erstellen des Diagramms keinen Code in den DataPoint-Elementen ausführen. Um Ihre Daten zu verknüpfen, benötigen Sie eine Methode in der View-Klasse. Das funktioniert bei mir gut. Auf diese Weise rendert das Steuerelement eine URL zu einem Bild, das vom http-Handler des Diagrammsteuerelements generiert wurde. In Ihrer Bereitstellung müssen Sie einen beschreibbaren Ordner bereitstellen, damit die Bilder zwischengespeichert werden können.
* VS 2010 / .NET 4-Unterstützung *
Damit dies in .NET 4 funktioniert, müssen Sie die Diagrammverweise auf Version 4.0.0.0 mit dem entsprechenden Token für den öffentlichen Schlüssel ändern.
Außerdem scheint das Diagrammsteuerelement jetzt URLs zum aktuellen Anforderungspfad und nicht zur Anforderungsroute zu generieren. Für mich bedeutete dies, dass alle Kartenanfragen zu 404 Fehlern führten, weil /{Controller}/ChartImg.axd
und Äquivalente durch Routen blockiert wurden. Um dies zu beheben, habe ich zusätzliche IgnoreRoute-Aufrufe hinzugefügt, die meine Verwendungszwecke abdecken. Eine allgemeinere Lösung wäre besser:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("ChartImg.axd/{*pathInfo}");
routes.IgnoreRoute("{controller}/ChartImg.axd/{*pathInfo}");
routes.IgnoreRoute("{controller}/{action}/ChartImg.axd/{*pathInfo}");
...
MemoryStream ms = new MemoryStream()
sollten in einemusing
Block sein, und MVC-Controller hat Hilfsmethoden für die Rückgabe von Dateien - anstattnew FileStreamResult
Sie könnenreturn File(ms.ToArray(), "image/png", "mychart.png")