首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MVC中实现图表的动态数据?

如何在MVC中实现图表的动态数据?
EN

Stack Overflow用户
提问于 2015-07-25 22:13:12
回答 2查看 2.5K关注 0票数 2

我是新加入ASP.NET MVC的,我在自己的项目上做,我有一些问题。我想用数据库的数据来绘制线状图。

我希望你能理解我(糟糕的英语,对不起):

我有一张金属表,在我点击具体的金属表后,我想看一看按日期显示金属价格的图表。

例如,我点击铜;

PricePoint是我的控制器,我应该打电话给这里吗?

代码语言:javascript
运行
复制
<a href="@Url.Action("DrawChart", "PricePoint", new { id = item.ID })">@Html.DisplayFor(modelItem => item.name)</a>

我在DrawChart控制器中调用PricePoint操作:

代码语言:javascript
运行
复制
public ActionResult DrawChart()
            {
    return View();
           }

在同一个控制器中,我创建了将数据从数据库添加到json并返回数据的操作。

代码语言:javascript
运行
复制
 public ActionResult Statistics(int ?id) {
        // here i pull data from database to stats 
        return Json(stats,JsonRequestBehavior.AllowGet);
    }

这是我想要显示图表的视图页面,DrawChart.cshtml文件。

代码语言:javascript
运行
复制
<script type="text/javascript">
    $.get('@Url.Action("Statistics")', function(result){
        new Morris.Line({
            // ID of the element in which to draw the chart.
            element: 'myfirstchart',
            // Chart data records -- each entry in this array corresponds to a point on
            // the chart.
            data: [
             result
            ],
            // The name of the data record attribute that contains x-values.
            xkey: 'year',
            // A list of names of data record attributes that contain y-values.
            ykeys: ['value'],
            // Labels for the ykeys -- will be displayed when you hover over the
            // chart.
            labels: ['Value']
        });
    });


</script>

当我单击DrawChart动作返回视图DrawChart.cshtml时,JavaScript运行统计函数并填充图表的数据,这是如何工作的吗?

我有空白页,没有结果,当我输入url:http://localhost:50101/PricePoint/DrawChart时,当url是下一个时,我从数据库:http://localhost:50101/PricePoint/Statistics中看到json数据。

我不知道哪里有问题。当我将示例数据放入脚本中时,如下所示

代码语言:javascript
运行
复制
data: [
      { year: '2008', value: 20 },
      { year: '2009', value: 10 },
      { year: '2010', value: 5 },
      { year: '2011', value: 5 },
      { year: '2012', value: 20 }
    ],

我看到了预期的线图。再次,对不起,英语不好,希望你能帮助我,我希望你理解我的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-26 00:12:52

我玩了一玩,还把图表显示得很好。这里有几件事情需要注意,这可能是你的问题的原因:

1)对$.get('@Url.Action("Statistics")'的调用并不是传递一个id,尽管您在操作public ActionResult Statistics(int ?id)上声明了一个id。考虑到它是可空的,也许您已经准备好在没有传递id的情况下提供默认的数据集,但是我想我要说的是,如果这影响到数据库检索的逻辑并影响返回的结果

2)我注意到,指向DrawChart操作的链接是在new { id = item.ID }中传递的,但是这在服务器端并没有捕获,因为您的DrawChart操作缺少了参数,所以应该是:public ActionResult DrawChart(id)。我知道这可能是为了把它简化成张贴在这里,可能不会影响任何事情,但我想我会指出。

3)小心您从MVC操作返回的内容。return Json(stats,JsonRequestBehavior.AllowGet);中的stats对象应该是包含数组中每个对象的属性值和年份的C#数组,如下所示:

代码语言:javascript
运行
复制
new[] {new Entry() {value = 20, year = 2008}, new Entry() {value = 10, year = 2009}};

如果您只是将一个字符串传递给返回Json()语句,它将不能正常工作,因为它会认为它只是一个长的json字符串,而不是json数组对象。

如果希望返回字符串,而不是实际序列化的c#集合,则可以使用以下内容:return Content(dataString, "application/json");

4)案件重要!确保返回的json包含每个条目的名称为年份和值的属性,就像在xkey和ykey值上在morris对象中声明的那样。这可能是一个非常微妙的陷阱,因为返回Json()将像类中声明的那样序列化json对象,而javascript代码的趋势是以.Net中小写的方式启动变量和属性,属性通常用大写字母(如公共int Year { get; set; } )声明。

结论:我是通过返回以下代码来工作的:

代码语言:javascript
运行
复制
 public ActionResult Statistics(int ?id) {
       var data = new[] {new Entry() {value = 20, year = 2008}, new Entry() {value = 10, year = 2009}};

            return Json(data,JsonRequestBehavior.AllowGet);
    }

在Morris初始化代码中,删除数据声明中的数组括号,使之成为data : result而不是data : [result]

解决此问题的第一步是查看统计方法返回的内容。例如,通过在Chrome中测试您的网站,然后点击F12,然后选择“网络”选项卡,您就可以很容易地做到这一点。然后Ctrl+F5页面并在结果窗格中找到对服务器的调用。单击它,然后选择Response,并继续对您的方法进行故障排除,直到它返回您所需的为止。

如果数据格式错误,并且不包含莫里斯期望的键,莫里斯会抛出一个错误,上面写着Uncaught TypeError: Cannot read property 'match' of undefined。继续努力,直到你把它弄走,希望你能看到你的图表:)

PS:最后一件事,我会将Morris init代码包装在$(document).ready()调用中

票数 1
EN

Stack Overflow用户

发布于 2015-07-26 03:42:34

当我从函数(手动输入)发送数据(值和日期)时,一切正常,json文件是受欢迎的上帝,我看到图表,但是当我从数据库发送数据时,没有图表,但我看到json文件也是弹出的。

这是代码:

代码语言:javascript
运行
复制
  public class YearlyStat
    {
        public string year { get; set; }
        public double value { get; set; }
    }

public ActionResult Statistics(int? id)
    {
        //var result = db.pricepoints.Where(r => r.commodityID.Equals(id));
        var items = from item in db.pricepoints
                    where (item.commodityID == id)
                    select item;

        var stats = new List<YearlyStat>();

        foreach (var item in items)
        {
            stats.Add(new YearlyStat
            {
                year = item.date_of_price.ToShortDateString(),
                value = item.value
            });

        }
        //but this work's
        //string s = "2.2.2002";
        //double v = 20.20;
        //stats.Add(new YearlyStat { year = s, value = v });
        //or
        //stats.Add(new YearlyStat { year = "2.2.2002", value = 20.20 });

        return Json(stats, JsonRequestBehavior.AllowGet);
    }

在这两种情况下,类型都是字符串和双。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31631647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档