2008-11-26 12 views

Respuesta

94

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}"); 
... 
+12

+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

+0

Gracias @Keith, ambos son buenos puntos, así que actualicé la respuesta. –

+0

+1 por la buena respuesta. Gracias por tomarse el tiempo. – gyurisc

2

Ya se puede utilizar con todo lo que tiene que hacer MVC es hacerlos como imágenes

0

he estado probando con MVC y hasta ahora parece que se está trabajando con MVC.

1

Hacer un control de usuario en lugar y darle el objeto gráfico completo y dejar que la hacen uno mismo:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.Web.UI.DataVisualization.Charting.Chart>" %> 
<% 
    Model.Page = this.Page; 
    var writer = new HtmlTextWriter(Page.Response.Output); 
    Model.RenderControl(writer); 
%> 

nombre que Chart.ascx y la puso en su carpeta de vista compartido.

ahora obtendrá todos los html adicionales, como el mapa de imagen, etc. de forma gratuita ... así como el almacenamiento en caché.

en su controlador:

public ActionResult Chart(){ 
var c = new Chart(); 
//... 
return View(c); 
} 

en su Vista:

<% Html.RenderPartial("Chart", Model); %> 
+0

Recibo un número de errores que NUNCA he visto antes de usar este método, el primero de los cuales es' Error al ejecutar la solicitud hija para ChartImg.axd'. ¿Pueden ayudarme con esto? – Jimbo

+0

Los usuarios sugirieron agregar '' al web.config en la sección ''; sin embargo, esto ocasiona otro error 'El estado de la sesión ha creado un ID de sesión, pero no puede guardarlo porque la respuesta ya estaba sonrojado por la aplicación. ¿Esto también sucedió en su implementación? – Jimbo

+0

usa .NET 4.0 o 3.5? si usa 3.5, debe agregar las cosas a web.config como http://stackoverflow.com/questions/319835/new-asp-net-charting-controls-will-the-work-with-mvc-eventually/320891 # 320891 sugiere. –

1

Este artículo trabajado a cabo mejor para mí:

http://www.codecapers.com/post/Build-a-Dashboard-With-Microsoft-Chart-Controls.aspx

no da errores sobre 'Objeto no configurado para una instancia de un objeto' o 'Identificación de sesión disponible, pero el flujo de respuesta se ha eliminado "(no la redacción exacta de los errores).

No estaba dispuesto a simplemente representarlos como una imagen porque si está haciendo profundizaciones o información sobre herramientas u otras acciones de clic en el gráfico, el renderizado como imagen no conserva nada de eso.

La clave para mis necesidades era poner las tablas en un modelo, pasar el modelo a la vista (o vista parcial) y poner un panel asp: en la vista y agregar la tabla (s) a la panel en el marcado de vista.

Por cierto, esto fue con VS.net 2008 y MVC 2 el 3 de septiembre de 2010 (las fechas fueron algo que encontré importante al buscar respuestas debido a los cambios que continuamente están ocurriendo en MVC).