Реализация MS Charts в проекте ASP.NET MVC3 - PullRequest
0 голосов
/ 16 ноября 2011

У меня есть приложение MVC, которое создает диаграмму в бизнес-логике следующим образом:

StatisticsModel.Chart.Width = 150
    StatisticsModel.Chart.Height = 300
    StatisticsModel.Chart.Attributes.Add("align", "left")

    StatisticsModel.Chart.Titles.Add("Statistics for: " + StatisticsModel.ProductNumbers)
    StatisticsModel.Chart.ChartAreas.Add(New ChartArea)

    StatisticsModel.Chart.Series.Add(New Series)

    StatisticsModel.Chart.Series(0).ChartType = SeriesChartType.Column

    StatisticsModel.Chart.Series(0).Points.DataBindXY(StatisticsModel.FailedTPDescriptionList, "key", StatisticsModel.FailedTPDescriptionList, "value")

Сейчас я пытаюсь реализовать это в View, но я прочитал много статей, и они предлагают мне поместить диаграмму в другой контроллер. Но это означало бы, что я должен отправить туда объект Chart, поскольку у меня есть много функций, для которых требуется диаграмма, и я подумал, что самый простой способ - это реализовать его в модели, а затем отрендерить его оттуда.

Я пытался использовать: http://code -inside.de / blog-in / 2008/11/27 / как использовать новую таблицу aspnet-chart-controls-with-aspnet-mvc /

А вот:

@Code
Dim writer As New HtmlTextWriter(Page.Response.Output)
End Code

У меня не сработало. Я использую VB.NET

Кто-нибудь может мне помочь? Предложения очень приветствуются.

1 Ответ

2 голосов
/ 16 ноября 2011

Существует множество способов создания и отображения диаграмм в MVC, и ссылка, на которую вы ссылались, довольно хороша, IMHO. Я использую c #, но я использую img-тег в представлении и указываю атрибут src на действие Controller:

<img id="diagram" src="<%=Url.Action("DrawChartImage", "Home") %>" alt="Chart Diagram" />

Действие контроллера возвращает FileContentResult:

public ActionResult DrawChartImage()
    {
        using (var chartHelper = new ChartHelper())
        {
            //get data
            var data = GetSomeDataForTheChart();

            //draw chart
            chartHelper.Draw(data);

            //return chart as png image
            return File(chartHelper.Image, "image/png");
        }
    }

Класс ChartHelper реализует IDisposable и имеет вспомогательное свойство (Image), которое возвращает диаграмму в виде файла. ПРИМЕЧАНИЕ. Это просто пример кода / фрагмента кода, показывающий, что я имею в виду:

public class ChartHelper : IDisposable
{
    private readonly Chart _chart;
    public Chart Chart
    {
        get
        {
            return _chart;
        }
    }

    public byte[] Image
    {
        get
        {
            using (var ms = new MemoryStream())
            {
                _chart.SaveImage(ms);
                return ms.GetBuffer();
            }
        }
    }

    public ChartHelper()
    {
        _chart = new Chart();
        _chart.Height = 300;
        _chart.Width = 800;
        _chart.ImageType = ChartImageType.Png;
        _chart.Titles.Add("some title");
        _chart.Legends.Add("some legend");
        _chart.ChartAreas.Add("some chart area");
    }

    public void Draw(List<Data> data)
    {
        var dataArrays = GetDataArrays(data); //another helper method...

        var series = new Series(tag);
        series.Name = tag;
        series.Legend = "tags";
        series.ChartType = SeriesChartType.Spline;
        series.BorderWidth = 4;

        //sample way to add data below... 
        series.Points.DataBindXY(dataArrays.Item1, dataArrays.Item2);

        _chart.Series.Add(series);
    }

    public void Dispose()
    {
        _chart.Dispose();
    }
}

Работает довольно хорошо для меня, надеюсь, это поможет, даже если он в C #.

РЕДАКТИРОВАТЬ Если вы хотите создать изображение / диаграмму в бизнес-логике, вызываемой из вашего «основного» действия контроллера, возможно, вы можете сделать что-то вроде этого, где вы сгенерируете изображение / диаграмму, а затем сохраните его в диск, кэш или базу данных и забрать его из действия контроллера рендеринга изображений:

        public ActionResult Index()
    {
        //this is call to your business logic or similar which generates the chart
        byte[] image = GenerateImage();
        //save image to cache, disk or from database
        HttpContext.Cache["image"] = image;
        return View();
    }

    public ActionResult Image()
    {
        //get image from cache, disk or from database
        var image = HttpContext.Cache["image"] as byte[];
        return File(image, "image/png"); 
    }

    //some sample/dummy code to generate image from a template
    private byte[] GenerateImage()
    {
        using (var ms = new MemoryStream())
        {
            using (var image = System.Drawing.Image.FromFile(@"c:/temp/template.png"))
            using (var brush = new SolidBrush(System.Drawing.Color.Black))
            using (var bmp = new System.Drawing.Bitmap(image, image.Width, image.Height))
            using (var g = System.Drawing.Graphics.FromImage(bmp))
            {
                g.DrawString(DateTime.Now.ToLongTimeString(), new Font("Consolas", 10), brush, 10, 10);
                bmp.Save(ms, ImageFormat.Png);
            }
            return ms.ToArray();
        }
    }

И вид будет:

<img src="@Url.Action("Image")"/>
...