Mvc  Chart 是一个使用起来非常方便的控件,可以自定义参数,能呈现给用户很漂亮的各种统计图表;使用此图表首先要导入命名空间:System.Web.UI.DataVisualization.Charting

此dll在vs自带的里面,它的位置: C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Web.DataVisualization.dll

效果图如下:

由于mvc 返回的是actionResult,而此图表chart返回的是图片,所以要封装一个ImageResult,如下:

 public class ImageResult : ActionResult
    {
        public ImageResult()
        { }

        public ImageResult(Image image)
        {
            Image = image;
        }

        public ImageResult(Image image, ImageFormat format)
        {
            Image = image;
            ImageFormat = format;
        }

        /// <summary> 
        /// 
        /// </summary> 
        public Image Image { get; set; }

        /// <summary> 
        /// 指定图像的文件格式 
        /// </summary> 
        public ImageFormat ImageFormat { get; set; }

        public override void ExecuteResult(ControllerContext context)
        {
            if (Image == null)
                throw new ArgumentNullException("Image");

            if (ImageFormat == null)
                throw new ArgumentNullException("ImageFormat");

            context.HttpContext.Response.Clear();

            if (ImageFormat.Equals(ImageFormat.Gif))
                context.HttpContext.Response.ContentType = "image/gif";
            else if (ImageFormat.Equals(ImageFormat.Jpeg))
                context.HttpContext.Response.ContentType = "image/jpeg";
            else if (ImageFormat.Equals(ImageFormat.Png))
                context.HttpContext.Response.ContentType = "image/png";
            else if (ImageFormat.Equals(ImageFormat.Bmp))
                context.HttpContext.Response.ContentType = "image/bmp";
            else if (ImageFormat.Equals(ImageFormat.Tiff))
                context.HttpContext.Response.ContentType = "image/tiff";
            else if (ImageFormat.Equals(ImageFormat.Icon))
                context.HttpContext.Response.ContentType = "image/vnd.microsoft.icon";
            else if (ImageFormat.Equals(ImageFormat.Wmf))
                context.HttpContext.Response.ContentType = "image/wmf";

            Image.Save(context.HttpContext.Response.OutputStream, ImageFormat);
        }
    }

 

后台代码如下:

   #region MVC Chart

        public ActionResult MVCChart()
        {
            return View();
        }

        public ActionResult ChartView()
        {
            return PartialView();
        }
        public ActionResult ZhuChart()
        {
            System.Web.UI.DataVisualization.Charting.Chart chart = new System.Web.UI.DataVisualization.Charting.Chart();
            chart.Width = 750;
            chart.Height = 400;
            chart.RenderType = RenderType.ImageTag;
            chart.Palette = ChartColorPalette.BrightPastel;
            Title t = new Title("活动数量分布", Docking.Top, new System.Drawing.Font("Trebuchet MS", 14, System.Drawing.FontStyle.Bold), System.Drawing.Color.FromArgb(26, 59, 105));
            chart.Titles.Add(t);

            chart.ChartAreas.Add("Subject");
            chart.ChartAreas[0].AxisX.Interval = 1;   //设置X轴坐标的间隔为1
            chart.ChartAreas[0].AxisX.IntervalOffset = 1;  //设置X轴坐标偏移为1
            chart.ChartAreas[0].AxisX.LabelStyle.IsStaggered = false;   //设置是否交错显示,比如数据多的时间分成两行来显示

            chart.Series.Add("Subject");

            chart.Series["Subject"].Label = "#VAL";
            chart.Series["Subject"].LegendText = "活动数量";

            List<string> actives = new List<string>();
            for (int i = 0; i < 10; i++)
            {
                actives.Add("活动" + i.ToString());
            }
            Random rd = new Random();

            foreach (var item in actives)
            {
                chart.Series["Subject"].Points.AddXY(item, rd.Next(50, 80));
            }

            chart.BorderSkin.SkinStyle = BorderSkinStyle.Emboss;
            chart.BorderColor = System.Drawing.Color.FromArgb(26, 59, 105);
            chart.BorderlineDashStyle = ChartDashStyle.Solid;
            chart.BorderWidth = 2;
            // chart.BackColor = Color.Green;
            chart.Legends.Add("Legend1");

            MemoryStream stream = new MemoryStream();
            chart.SaveImage(stream, ChartImageFormat.Jpeg);

            return new ImageResult(Image.FromStream(stream), ImageFormat.Jpeg);
        }

        public ActionResult pieChart()
        {
            List<string> xValues = new List<string>();
            List<string> yValues = new List<string>();
            List<string> actives = new List<string>();
            for (int i = 0; i < 10; i++)
            {
                actives.Add("活动" + i.ToString());
            }
            Random rd = new Random();

            foreach (var item in actives)
            {
                xValues.Add(item);
                yValues.Add(rd.Next(10, 30).ToString());
            }

            System.Web.UI.DataVisualization.Charting.Chart pieChar = new System.Web.UI.DataVisualization.Charting.Chart();
            pieChar.Series.Add("Default");
            pieChar.Series["Default"].Points.DataBindXY(xValues, yValues);
            pieChar.Series["Default"].Label = "#AXISLABEL #VAL";
            pieChar.Series["Default"].LegendText = "#AXISLABEL #PERCENT{P1}";
            Title pieTitle = new Title("加分项活动比例", Docking.Top, new System.Drawing.Font("Trebuchet MS", 14, System.Drawing.FontStyle.Bold), System.Drawing.Color.FromArgb(26, 59, 105));
            pieChar.Titles.Add(pieTitle);

            pieChar.Width = 380;
            // Set Doughnut chart type
            pieChar.Series["Default"].ChartType = SeriesChartType.Pie;
            // Set labels style
            pieChar.Series["Default"]["PieLabelStyle"] = "Inside";
            // Set Doughnut radius percentage
            pieChar.Series["Default"]["DoughnutRadius"] = "70";
            // Explode data point with label "Italy"
            //pieChar.Series["Default"].Points[4]["Exploded"] = "true";
            // Enable 3D
            pieChar.ChartAreas.Add("ChartArea1");
            pieChar.ChartAreas["ChartArea1"].Area3DStyle.Enable3D = true;

            // Disable the Legend
            pieChar.Legends.Add("Lengenedpie");
            pieChar.Legends[0].Enabled = true;

            MemoryStream stream = new MemoryStream();
            pieChar.SaveImage(stream, ChartImageFormat.Jpeg);

            return new ImageResult(Image.FromStream(stream), ImageFormat.Jpeg);
        }

        public ActionResult lineChart()
        {
            System.Web.UI.DataVisualization.Charting.Chart chart = new System.Web.UI.DataVisualization.Charting.Chart();
            chart.Width = 830;
            chart.Height = 500;
            chart.RenderType = RenderType.ImageTag;
            chart.Palette = ChartColorPalette.BrightPastel;
            Title t = new Title("污水处理实时曲线", Docking.Top, new System.Drawing.Font("Trebuchet MS", 14, System.Drawing.FontStyle.Bold), System.Drawing.Color.FromArgb(26, 59, 105));
            chart.Titles.Add(t);
            chart.ChartAreas.Add("Default");

            List<string> actives = new List<string>();
            for (int i = 0; i < 5; i++)
            {
                actives.Add("活动" + i.ToString());
            }

            Random rd = new Random();
            foreach (var item in actives)
            {
                chart.Series.Add(item.ToString());


                chart.Series[item.ToString()].LegendText = item;
                chart.Series[item.ToString()].ChartType = SeriesChartType.Line;
                chart.Series[item.ToString()].XValueType = ChartValueType.DateTime;

                for (int i = 0; i < 10; i++)
                {
                    chart.Series[item.ToString()].Points.AddXY(DateTime.Now.AddDays(0 - i).ToOADate(), rd.Next(10, 100));
                }
            }

            chart.ChartAreas["Default"].AxisX.LabelStyle.IsStaggered = false;
            chart.ChartAreas["Default"].AxisX.LabelStyle.Format = "HH:mm";

            chart.BorderColor = System.Drawing.Color.FromArgb(26, 59, 105);
            chart.BorderlineDashStyle = ChartDashStyle.Solid;
            chart.BorderWidth = 2;
            chart.Legends.Add("Legend1");
            chart.ChartAreas["Default"].AxisX.IntervalAutoMode = IntervalAutoMode.VariableCount;

            MemoryStream stream = new MemoryStream();
            chart.SaveImage(stream, ChartImageFormat.Jpeg);
            return new ImageResult(Image.FromStream(stream), ImageFormat.Jpeg);
        }
        #endregion

 

前台页面加载图表可以用ajax,代码如下:

MVCChart 页面的代码:

@{
    ViewBag.Title = "MVCChart";
}
<script type="text/javascript">
    $(function () {
        loadChart();
    })

    function loadChart() {
        $("#zhu").load("/Report/ChartView");
    }
</script>
<div id="zhu" style="width:100%"></div>

ChartView的页面代码:

@{
    ViewBag.Title = "ZhuView";
}
<table style="width: 100%">
    <tr>
        <td>
            <img src="@Url.Action("ZhuChart")" alt="柱状图"/>
        </td>
    </tr>
    <tr>
        <td>
            <img src="@Url.Action("pieChart")" alt="饼状图"/>
        </td>
    </tr>
    <tr>
        <td>
            <img src="@Url.Action("lineChart")" alt="曲线图"/>
        </td>
    </tr> 
</table>

 

posted on 2014-09-02 10:50  日月草方  阅读(1090)  评论(0编辑  收藏  举报