Usted puede utilizar los controles de gráficos de dos maneras:
generar la imagen de un controlador
Mediante la generación de la tabla y devolverlo como una imagen de una acción (como Chatuman se refiere a creo):
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 Style
De esta manera, simplemente incluya el gráfico en sus vistas .aspx (al igual que con los formularios web tradicionales). Para ello se tendrá que conectar los bits correspondientes en su web.config
<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>
No puede ejecutar código dentro de los elementos DataPoint la hora de construir el gráfico, así conectar sus datos se necesita un método en la clase de Vista. Esto funciona bien para mi Trabajar de esta manera hace que el control represente una URL a una imagen generada por el controlador http de control de gráficos. En su implementación, deberá proporcionar una carpeta de escritura para que guarde en caché las imágenes.
* VS 2010/.NET 4 * Soporte
Para conseguir este trabajo en .NET 4 necesita cambiar las referencias a la versión 4.0.0.0 gráfico con el símbolo de clave pública correspondiente.
También parece que el control de gráfico ahora genera direcciones URL para la ruta de solicitud actual en lugar de la ruta de solicitud. Para mí, esto significaba que todas las solicitudes de gráficos daban como resultado errores 404 porque /{Controller}/ChartImg.axd
y equivalentes estaban bloqueados por rutas. Para solucionar este añadí llamadas IgnoreRoute adicionales que cubren mis usos - una solución más general sería mejor:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("ChartImg.axd/{*pathInfo}");
routes.IgnoreRoute("{controller}/ChartImg.axd/{*pathInfo}");
routes.IgnoreRoute("{controller}/{action}/ChartImg.axd/{*pathInfo}");
...
+1 - agradable. 2 pequeños cambios: 'MemoryStream ms = new MemoryStream()' debe estar en un bloque 'using', y el controlador MVC tiene métodos de ayuda para devolver archivos; en lugar de' new FileStreamResult' puedes hacer 'return File (ms.ToArray() , "image/png", "mychart.png") ' – Keith
Gracias @Keith, ambos son buenos puntos, así que actualicé la respuesta. –
+1 por la buena respuesta. Gracias por tomarse el tiempo. – gyurisc