[Перевод] Использование ASP.NET Charting в ASP.NET MVC

воскресенье, 4 июля 2010, Александр Краковецкий

Еще одна статья-перевод от MuzhyK.

Рассмотрим как можно использовать элемент управления ASP.NET Charting в приложениях ASP.NET MVC.

Для начала создадим ASP.NET MVC приложение и добавим сборку System.Web.DataVisualization с помощью Add Reference. Затем к нашему проекту добавим класс ChartResult (название класса может быть любым), который унаследуем от класса FileResult. Этот класс будет содержать объявления для MIME типов. Поскольку этот класс наследуется от класса FileResults из System.Web.Mvc, то мы должны переопределить метод WriteFile, который принимает в качетсве параметра обьект HttpResponseBase. Метод WriteFile затем может быть использован для создания потока памяти Output.

Вот как будет выглядеть класс:

public class ChartResult : FileResult
     {
       private const int _bufferSize = 0x1000;
   
       public ChartResult(Chart chart, ChartImageFormat imageFormat)
         : base(MapImageFormatToMimeType(imageFormat))
       {
         if (null == chart) throw new ArgumentNullException("chart");
   
         this.Chart = chart;
         this.ImageFormat = imageFormat;
       }
   
       public ChartResult(Chart chart)
         : this(chart, ChartImageFormat.Png)
       {
       }
   
       public Chart Chart
       {
         get;
         private set;
       }
   
       public ChartImageFormat ImageFormat
       {
         get;
         private set;
       }
   
       private static string MapImageFormatToMimeType(ChartImageFormat imageFormat)
       {
         switch (imageFormat)
         {
           case ChartImageFormat.Png:
             return "image/png";
   
           case ChartImageFormat.Jpeg:
             return "image/jpeg";
   
           case ChartImageFormat.Gif:
             return "image/gif";
   
           case ChartImageFormat.Bmp:
             return "image/bmp";
   
           case ChartImageFormat.Tiff:
             return "image/tiff";
   
           // TODO: MIME types for EMF?
           // case ChartImageFormat.Emf:
           // case ChartImageFormat.EmfPlus:
           // case ChartImageFormat.EmfDual:
   
           default:
             throw new ArgumentException("Unsupported format");
         }
       }
   
       protected override void WriteFile(HttpResponseBase response)
       {
         // NB: Can't save directly to the output stream,
         // as most image formats require a seekable stream.
   
         using (var imageStream = new MemoryStream())
         {
           this.Chart.SaveImage(imageStream, this.ImageFormat);
           imageStream.WriteTo(response.OutputStream);
         }
       }
     }

Обратите внимание на то, что при использовании классов ChartResult і FileResult элемент управления ASP.NET Charting будет представлятся как файл изображения на вашем MVC View. Теперь давайте посмотрим как ChartResult может быть использован для представления диаграммы ASP.NET Charting как изображения.

Давайте посмотрим как будет выглядеть View Page:

Есть две возможности для визуализации изображения, мы могли бы создать ViewPage в MVC, который только предоставляет изображения или просто использовать тег и определить его источник Action Method в Controller.

Bar Chart

 Pie Chart

 Line Chart

Home/BarChart и Home/PieChart - два MVC вида, которые используются для отображения результата. Если вы считаете лишним создание вида только для отображения рисунка вы правы :). Таким образом, третья строка в приведенном выше фрагменте показывает, как атрибут изображения тег src может быть использован для отображения рисунка. Мы предоставляем атрибут src методу Action Method, который возвращает FileResult.

Теперь посмотрим как будет выглядеть код для Controller (обратите внимание, этот код не обязательно должен быть в Controller, он вставлен для легкой демонстрации результатов).

Ниже показано как может быть создан BarChart:

public ChartResult BarChart()
       {
         Chart chart = new Chart();
         chart.Width = 480;
         chart.Height = 300;
         chart.RenderType = RenderType.ImageTag;
         chart.Palette = ChartColorPalette.Fire;
         Title t = new Title("Bar Chart", Docking.Left, new Font("Trebuchet MS", 14, FontStyle.Bold), Color.Black);
         chart.Titles.Add(t);
   
   
         chart.BorderSkin.SkinStyle = BorderSkinStyle.Emboss;
         chart.BorderlineWidth = 2;
         chart.BorderlineColor = Color.Black;
         chart.BorderlineDashStyle = ChartDashStyle.Solid;
   
         chart.ChartAreas.Add("Default");
   
         chart.Legends.Add("Legend1");
   
         chart.Series.Add("Series 1");
        chart.Series.Add("Series 2");
   
         List data = new List();
         data.Add(3);
         data.Add(9);
         data.Add(5);
         data.Add(2);
         data.Add(4);
         data.Add(7);
   
         //Series 1
         foreach (int value in data)
         {
           chart.Series["Series 1"].Points.AddY(value);
         }
   
         //Series 2
         foreach (int value in data)
        {
           chart.Series["Series 2"].Points.AddY(value - 1);
         }
   
         return new ChartResult(chart, ChartImageFormat.Png);
       }

Ниже показано как может быть создан PieChart:

public ChartResult PieChart()
       {
         Chart pieChart = new Chart();
   
         pieChart.Width = 480;
         pieChart.Height = 300;
         pieChart.RenderType = RenderType.ImageTag;
         pieChart.Palette = ChartColorPalette.BrightPastel;
         Title t = new Title("Pie Chart", Docking.Left, new Font("Trebuchet MS", 14, FontStyle.Bold), Color.Black);
         pieChart.Titles.Add(t);
    
         pieChart.ChartAreas.Add("defaultChartArea");
   
         pieChart.Legends.Add("Legend1");
   
         pieChart.Series.Add("PieChartSeries");
   
         // Initialize an array of doubles
         double[] yval = { 2, 6, 4, 5, 3 };
   
         // Initialize an array of strings
         string[] xval = { "Peter", "Andrew", "Julie", "Mary", "Dave" };
   
         pieChart.Series["PieChartSeries"].ChartType = SeriesChartType.Pie;
   
         // Set series visual attributes
         pieChart.Series["PieChartSeries"].Color = Color.CornflowerBlue;
         pieChart.Series["PieChartSeries"].BackSecondaryColor = Color.SkyBlue;
   
   
         pieChart.Series["PieChartSeries"].BorderColor = Color.Gray;
         pieChart.Series["PieChartSeries"].BorderWidth = 2;
         pieChart.Series["PieChartSeries"].BorderDashStyle = ChartDashStyle.Solid;
   
         pieChart.Series["PieChartSeries"].ShadowOffset = 2;
   
   
         //Bind the data to chart
         pieChart.Series["PieChartSeries"].Points.DataBindXY(xval, yval);
         //Turn on Legend
         pieChart.Series["PieChartSeries"]["PieLabelStyle"] = "Disabled";
         //Turn on Labelling
         pieChart.Series["PieChartSeries"]["PieLabelStyle"] = "Inside";
    
         //Make the Leged to display text and percentage
         pieChart.Series["PieChartSeries"].LegendText = "#AXISLABEL - #PERCENT{P0}";
   
         return new ChartResult(pieChart, ChartImageFormat.Png);
     }

Ниже показано как может быть создан LineChart:

public ChartResult LineChart()
       {
   
         Chart lineChart = new Chart();
   
         lineChart.Width = 480;
         lineChart.Height = 300;
        lineChart.RenderType = RenderType.ImageTag;
         lineChart.Palette = ChartColorPalette.BrightPastel;
         Title t = new Title("Line Chart", Docking.Left, new Font("Trebuchet MS", 14, FontStyle.Bold), Color.Black);
         lineChart.Titles.Add(t);
         lineChart.ChartAreas.Add("defaultChartArea");
         lineChart.Legends.Add("Legend1");
         lineChart.Series.Add("LineChartSeries");
         lineChart.Series["LineChartSeries"].ChartType = SeriesChartType.Line;
   
         // Set series visual attributes
         lineChart.Series["LineChartSeries"].Color = Color.Red;
         lineChart.Series["LineChartSeries"].BackSecondaryColor = Color.SkyBlue;
    
         lineChart.Series["LineChartSeries"].BorderColor = Color.Gray;
         lineChart.Series["LineChartSeries"].BorderWidth = 2;
         lineChart.Series["LineChartSeries"].BorderDashStyle = ChartDashStyle.Solid;
   
         lineChart.Series["LineChartSeries"].ShadowOffset = 2;
    
         // Populate series with random data
         Random random = new Random();
         for (int pointIndex = 0; pointIndex < 15; pointIndex++)
         {
           lineChart.Series["LineChartSeries"].Points.AddY(random.Next(45, 95));
         }
         return new ChartResult(lineChart, ChartImageFormat.Png);
      }

При запуске приложения вы можете увидеть две ссылки и рисунок, отображаемый на главной странице.

BarChart:

PieChart:


Дополнительные ссылки:


Ищите нас в интернетах!

Комментарии

Свежие вакансии