ASP.NET Core MVC TagHelper实践HighchartsNET快速图表控件

ASP.NET Core MVC TagHelper最佳实践HighchartsNET快速图表控件支持ASP.NET Core。

曾经在WebForms上写过 HighchartsNET快速图表控件-开源 Highcharts的ASP.NET Web自定义控件。

今天我就来改造它,将其使用最新的TagHelper 来实践,学习TagHelper 的使用也提供一个方便的图表控件在ASP.NET Core MVC中使用。

下面正式开始,使用之前的代码直接进行迁移升级。

GitHub:https://github.com/linezero/HighchartsNET

 

代码迁移升级

首先我们新建一个 .NET Core Class Library -> HighchartsNETCore

然后我们添加引用

Install-Package Microsoft.AspNetCore.Razor.Runtime

新建一个HighChartsTagHelper.cs然后将之前的 HighCharts.cs 的代码复制到其中,进行相关更改。

这里首先需要引用 using Microsoft.AspNetCore.Razor.TagHelpers; 然后继承 TagHelper 重写 Process。

在之前的属性上加上 HtmlAttributeName 特性,调整方法。

最终主要代码如下:

public class HighChartsTagHelper : TagHelper

    {

        /// <summary>

        /// 图表标题

        /// </summary>

        [HtmlAttributeName("title")]

        public string Title { get; set; }

        /// <summary>

        /// 图表类型

        /// </summary>

        [HtmlAttributeName("type")]

        public ChartType Type { get; set; }

        /// <summary>

        /// 图表2级标题

        /// </summary>

        [HtmlAttributeName("subtitle")]

        public string SubTitle { get; set; }


        /// <summary>

        /// 数据对象

        /// </summary>

        [HtmlAttributeName("series")]

        public ChartsSeries Series { get; set; }


        /// <summary>

        /// 一些附加选项

        /// </summary>

        [HtmlAttributeName("plotoptions")]

        public string PlotOptions { get; set; }

        /// <summary>

        /// X轴选项

        /// </summary>

        [HtmlAttributeName("xAxis")]

        public List<object> XAxis { get; set; }

        /// <summary>

        /// Y轴选项 默认可以只填名称

        /// </summary>

        [HtmlAttributeName("yAxis")]

        public string YAxis { get; set; }


        /// <summary>

        /// 提示格式

        /// </summary>

        [HtmlAttributeName("Tooltip")]

        public string Tooltip { get; set; }

        /// <summary>

        /// 图表层id(容器)

        /// </summary>

        [HtmlAttributeName("id")]

        public string Id { get; set; }


        /// <summary>

        /// 图标下方标识是否显示 默认不显示

        /// </summary>

        [HtmlAttributeName("legend")]

        public bool Legend { get; set; }


        /// <summary>

        /// 高级功能,多个数据集,多条图表,饼图不需要。

        /// </summary>

        [HtmlAttributeName("serieslist")]

        public List<ChartsSeries> SeriesList { get; set; }


        [HtmlAttributeName("width")]

        public int Width { get; set; }


        [HtmlAttributeName("height")]

        public int Height { get; set; }


        private void HighChartsJs(StringBuilder jscode)

        {

            jscode.Append("$(function(){$('#" + Id + "').highcharts({ ");

            jscode.Append("credits: { enabled: false },");

            jscode.Append("chart:{ type: '" + Type.ToString().ToLower() + "'");

            if (Width>0)

                jscode.Append(",width:" + Width);

            if (Height>0)

                jscode.Append(",height:" + Height);

            jscode.Append("},");

            if (!string.IsNullOrEmpty(Title))

                jscode.Append("title: { text: '" + Title + "'},");

            if (!string.IsNullOrEmpty(SubTitle))

                jscode.Append("subtitle: { text: '" + SubTitle + "'},");

            //判断类型及数据显示

            if (XAxis != null && Type != ChartType.Pie)

            {                

                XAxisToString(jscode, XAxis);

            }

            else if (Series.SeriesData != null && Type != ChartType.Pie)

            {

                XAxisToString(jscode, Series.SeriesData.Keys.ToList());

            }

            else if (SeriesList != null && SeriesList.Count > 0)

            {

                XAxisToString(jscode, SeriesList[0].SeriesData.Keys.ToList());

            }

            if (!string.IsNullOrEmpty(YAxis))

            {

                if (YAxis.IndexOf("title") < 0)

                {

                    jscode.Append("yAxis: { title:{ text:'" + YAxis + "'}},");

                    if(string.IsNullOrEmpty(Tooltip))

                        jscode.Append("tooltip: { valueSuffix:'" + YAxis + "' },");

                }

                else

                {

                    jscode.Append("yAxis: {" + YAxis + "},");

                }

            }

            jscode.Append("legend: { enabled: "+Legend.ToString().ToLower()+" },");

            if (!string.IsNullOrEmpty(Tooltip))

                jscode.Append("tooltip: {" + Tooltip + "},");

            if (!string.IsNullOrEmpty(PlotOptions))

                jscode.Append("plotOptions:{" + PlotOptions + "},");

            //数据处理方法

            SeriesToString(jscode);

            jscode.Append(" }); });");

        }


        private void SeriesToString(StringBuilder sb)

        {

            sb.Append("series: [");

            string seriesdata = string.Empty;

            if (Series.SeriesData != null)

            {

                seriesdata = SeriesDataToString(Series);

            }

            if (SeriesList != null && SeriesList.Count != 0)

            {

                foreach (ChartsSeries ser in SeriesList)

                {

                    seriesdata += SeriesDataToString(ser) + ",";

                }

                seriesdata = seriesdata.TrimEnd(',');

            }

            sb.Append(seriesdata);

            sb.Append("]");

        }


        /// <summary>

        /// 数据部分转成js代码

        /// </summary>

        /// <param name="series"></param>

        /// <returns></returns>

        private string SeriesDataToString(ChartsSeries series)

        {

            string seriesdata = "{ name: '" + series.SeriesName + "',data:[";

            foreach (var item in series.SeriesData)

            {

                seriesdata += "['" + item.Key + "'," + item.Value + "],";

            }

            seriesdata = seriesdata.TrimEnd(',');

            seriesdata += "] }";

            return seriesdata;

        }

        /// <summary>

        /// x轴上数据转换

        /// </summary>

        /// <param name="sb"></param>

        /// <param name="xAxis"></param>

        private void XAxisToString(StringBuilder sb, List<object> xAxis)

        {            

            sb.Append("xAxis: { categories: [");

            string xaxis = string.Empty;

            foreach (var item in xAxis)

            {

                xaxis += "'" + item + "',";

            }

            xaxis = xaxis.TrimEnd(',');

            sb.Append(xaxis);

            sb.Append("]},");

        }


        public override void Process(TagHelperContext context, TagHelperOutput output)

        {

            if (Series == null) return;

            output.Attributes.SetAttribute("title", "HighchartsNET自动生成 By:LineZero");

            output.Attributes.SetAttribute("id", Id);

            StringBuilder style = new StringBuilder("margin:0px auto;min-width:400px;");

            if (Width > 0)

                style.Append($"width:{Width}px;");

            if (Height > 0)

                style.Append($"heigth:{Height}px;");

            output.Attributes.SetAttribute("style",style.ToString());

            output.TagName = "div";

            StringBuilder innerhtml = new StringBuilder();

            innerhtml.Append("<script>");

            HighChartsJs(innerhtml);

            innerhtml.Append("</script>");

            output.PostElement.AppendHtml(innerhtml.ToString());

        }

    }

TagHelper 使用

代码编写好以后,新建一个 ASP.NET Core Web Application 名为 HighchartsNETCoreWeb -> 选择Web应用程序-》不进行身份验证。

添加 HighchartsNETCore 引用。

然后打开 Views/_ViewImports.cshtml 文件添加:

@using HighchartsNETCoreWeb
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers@addTagHelper *,HighchartsNETCore

然后将 Home/Index.cshtml 替换为如下代码:

<script src="http://cdn.hcharts.cn/jquery/jquery-1.8.3.min.js"></script><script src="http://cdn.hcharts.cn/highcharts/highcharts.js"></script>
<div><high-charts id="demoline" title="ASP.NET Core 线图" subtitle="http://www.cnblogs.com/linezero" type="Line" series="ViewBag.Series"></high-charts><high-charts id="democolumn" title="ASP.NET Core柱图" subtitle="http://www.cnblogs.com/linezero" type="Column" series="ViewBag.Series"></high-charts><high-charts id="demopie" title="ASP.NET Core饼图" subtitle="http://www.cnblogs.com/linezero" type="Pie" series="ViewBag.Series"></high-charts>
</div>


在Index Action添加数据源

        public IActionResult Index(){ChartsSeries series = new ChartsSeries();Dictionary<object, object> dic = new Dictionary<object, object>();Random r = new Random();   
          
for (int i = 0; i < 12; i++){dic.Add(DateTime.Now.AddDays(i).ToString("yyyyMMdd"), r.Next(20));}series.SeriesName = "温度";series.SeriesData = dic;ViewBag.Series = series;            return View();}


运行程序 http://localhost:5000/

 

 

更多使用示例可以参考以前的Web 文件夹。

将HighchartsNETCore 打包以后可以直接适用于任意ASP.NET Core MVC应用程序。

原文链接: http://www.cnblogs.com/linezero/p/HighchartsMVCTagHelper.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构师6

系统架构师考试总结 2019年06月11日 10:48:47 devillyd2018 阅读数 103 2011年11月12日&#xff0c;在这个百年一遇的大单身节的第二天&#xff0c;我怀着无比紧张的心情走进了系统架构师的考场。 虽然暂时还不知道我的成绩&#xff0c;无所谓啦&#xff0c;虽然答的一般&…

计算机视觉论文doc,嘉炬-计算机视觉论文资料.doc

成 绩评卷人姓 名嘉炬学 号华 中 师 范 大 学研 究 生 课 程 论 文论文题目 计算机视觉技术在教育领域的应用完成时间 2015年1月15日课程名称 计算机视觉专 业 通信与信息系统年 级 2014级注&#xff1a;研究生须在规定期限内完成课程论文&#xff0c;并用A4页面打印&#xff0…

Oracle数据库基本概念理解(1)

--函数 数字转换为字符 --0 强制位数&#xff0c;9位数不够不显示 $美元 SELECT TO_CHAR(124.3456,0000.00) FROM dual ; SELECT TO_CHAR(124.3456,9999.99) FROM dual ; SELECT TO_CHAR(124.3456,$9999.99) FROM dual ; --日期 日期转换为字符 SELECT TO_CHAR(SYSDATE,YY…

关于Heap Dump

转载自 关于Heap DumpHeap Dump是什么&#xff1f; Heap Dump也叫堆转储文件&#xff0c;是一个Java进程在某个时间点上的内存快照。Heap Dump是有着多种类型的。不过总体上heap dump在触发快照的时候都保存了java对象和类的信息。通常在写heap dump文件前会触发一次FullGC&a…

使用StyleCop 进行代码评审

使用StyleCop对原代码进行审查&#xff0c;看编写的代码是否遵循设计规范、.Net约定和一些贯用法等。保证代码的一致性&#xff0c;可读性等等。 在此之前&#xff0c;先简单介绍下FxCop&#xff08;起初只是微软内部使用的工具&#xff09;,一个分析托管程序集&#xff0c;检测…

系统架构师5 ***********那就给个合格分了。111

https://download.csdn.net/download/sun_lq/11109495 https://download.csdn.net/download/u011669055/10736374 https://download.csdn.net/download/robertsoft/10747039 十年IT从业背景&#xff0c;一次考试通过系统分析师(通过系统分析师的学习 ... [复制链接] 发表于 …

2012三年大专计算机试题医学,计算机原理2012年4月真题(02384)

计算机原理2012年4月真题及答案解析(02384)计算机原理2012年4月真题及答案解析(02384)&#xff0c;该试卷为计算机原理自考历年真题试卷&#xff0c;包含答案及详细解析。一、单项选择题(本大题共15小题&#xff0c;每小题2分&#xff0c;共30分)在每小题列出的四个备选项中只有…

JVM内存管理------JAVA语言的内存管理概述

转载自 JVM内存管理------JAVA语言的内存管理概述引言 内存管理一直是JAVA语言自豪与骄傲的资本&#xff0c;它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节&#xff0c;只专注于业务逻辑。不过世界上不存在十全十美的好事&#xff0c;在带来了便利的同时&#xf…

微软市值今天涨了 250 亿,这家离我们越来越远的公司,为什么生意反倒越来越好了?

纳德拉上台两年半&#xff0c;微软市值已经涨了 50% 今天早上&#xff0c;微软发布了今年第三季度的财报。受云计算和 Office 业务推动&#xff0c;财报后的盘后交易里&#xff0c;微软股价上涨 5.9%、市值涨了超过 250 亿美元——收购 LinkedIn 的钱差不多就回来了。 财报发布…

系统架构设计师考试 重要的部分

系统架构师考试比较的难&#xff0c;属于软件工程师考试中的高级考试&#xff0c;有选择题&#xff0c;分析题&#xff0c;论文&#xff0c;请坚持。 这是高产似母猪啊。 1.每天2小时&#xff0c;坚持了4年考过了软件设计师&#xff0c;系统架构师&#xff0c; 四年时间花了大…

计算机文化基础分析总结,《计算机文化基础实训》教学方案设计与课题分析总结.doc...

《计算机文化基础实训》教学方案设计与课题分析总结.doc《计算机文化基础一实训》教学方案设计与课题分析总结袁良风&#xff3b; 】我院自开展木课题研宄工作以来&#xff0c;紧紧围绕“项目教学法”教学的应 用问题&#xff0c;积极主动地开展专题研究和教改实验&#xff0c;…

Oracle数据库基本概念理解(2)

--删除用户 drop user sz cascade; --创建表空间 create tablespace worktablsp datafile C:\app\lenovo\oradata\orcl\EMPTB.dbf SIZE 5MAUTOEXTEND ON; --修改表空间 ALTER tablespace worktablsp ADD datafile C:\app\lenovo\oradata\orcl\EMPTB.dbf SIZE 5M;--扩展数据文件…

Java中关于String类型的10个问题

转载自 Java中关于String类型的10个问题1. 如何比较两个字符串&#xff1f;用“”还是equals 简单来说&#xff0c;“”是用来检测俩引用是不是指向内存中的同一个对象&#xff0c;而equals()方法则检测的是两个对象的值是否相等。只要你想检测俩字符串是不是相等的&#xff…

[ASP.NET Core] Static File Middleware

前言 本篇文章介绍ASP.NET Core里&#xff0c;用来处理静态档案的Middleware&#xff0c;为自己留个纪录也希望能帮助到有需要的开发人员。 ASP.NET Core官网 结构 一个Web站台最基本的功能&#xff0c;就是在接收到从「浏览器传入」的HTTP Request封包后&#xff0c;将站台内所…

JVM 优化经验总结

转载自 JVM 优化经验总结开始之前 Java 虚拟机有自己完善的硬件架构, 如处理器、堆栈、寄存器等&#xff0c;还具有相应的指令系统。JVM 屏蔽了与具体操作系统平台相关的信息&#xff0c;使得 Java 程序只需生成在 Java 虚拟机上运行的目标代码 (字节码), 就可以在多种平台上不…

2016年10月20日 .NET Core 1.0.2 更新

我们今天发布了一个更新&#xff0c;解决了在macOS Sierra系统上安装的问题。 更改仅限于macOS安装程序。 运行时或工具没有更改; .NET Core 1.0.1仍是Windows和Linux的最新版本&#xff0c;最新的Microsoft.NETCore.App版本仍为1.0.1。 您现在可以下载更新的.NET Core 1.0.2 m…

window7连接其他计算机的打印机,win7系统电脑怎样连接其它电脑上在打印机?

2017-12-02 回答方法/步骤1第一步&#xff1a;设置共享打印机电脑。(a电脑)单击【开始】-【设备和打印机】或点击【开始】/【控制面板】/【硬件和声音】/【设备和打印机】&#xff0c;打开【添加设备】和【添加打印机】窗口&#xff0c;如图1所示2设置要共享的打印机&#xff0…

系统架构设计师考试999999999999

系统架构师考试比较的难&#xff0c;属于软件工程师考试中的高级考试&#xff0c;有选择题&#xff0c;分析题&#xff0c;论文&#xff0c;请坚持。 这是高产似母猪啊。 1.每天2小时&#xff0c;坚持了4年考过了软件设计师&#xff0c;系统架构师&#xff0c; 四年时间花了大…

Java启动参数与内存调优一些学习笔记

转载自 Java启动参数与内存调优一些学习笔记 .参数的含义-Xms128m JVM初始分配的堆内存 -Xmx512m JVM最大允许分配的堆内存&#xff0c;按需分配 -XX:PermSize64M JVM初始分配的非堆内存 -XX:MaxPermSize128M JVM最大允许分配的非堆内存&#xff0c;按需分配 JVM内存模型 …

Oracle数据库基本概念理解(3)

/*| PL/SQL编程*/ --声明变量 DECLAREV_NAME VARCHAR2(20); --一般变量V_AGE NUMBER(2);v_id SUN.TUSER.USERID%TYPE:14;--属性变量v_user SUN.TUSER%ROWTYPE; --行属性变量 BEGIN--赋常量值V_NAME:Tom;V_AGE :20;DBMS_OUTPUT.put_line(姓名&#xff1a;||V_NAME||年…