【问题标题】:How to populate google charts using data from database created via code first - ASP.Net MVC如何使用首先通过代码创建的数据库中的数据填充谷歌图表 - ASP.Net MVC
【发布时间】:2015-12-08 02:10:07
【问题描述】:

我想用我使用 Code First 方法创建的数据库中的数据替换下面代码中的硬编码数据。

但是,我真的不知道怎么做,因为我对此还是很陌生。谷歌图表与硬编码值完美配合,但如何使用我数据库中的实际数据来处理它是我理解的终点。关于如何使用硬编码数据执行此操作的教程很多(关于 Code First),但没有关于使用数据库中的数据的教程。

有人可以向我提供有关如何执行此操作的详细方法,以便我更好地理解它吗?我将不胜感激并提前致谢!

如果需要任何其他信息,请告诉我,我会尝试将其添加到问题中。

型号:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace HealthHabitat.Models
{
    public class ProductModel
    {
        public string YearTitle { get; set; }
        public string SaleTitle { get; set; }
        public string PurchaseTitle { get; set; }
        public Product ProductData { get; set; }
    }
    public class Product
    {
        public string Year { get; set; }
        public string Purchase { get; set; }
        public string Sale { get; set; }
    }
}

控制器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using HealthHabitat.Models;

namespace HealthHabitat.Controllers
{
    public class ChartController : Controller
    {
        //
        // GET: /Home/

        public ActionResult Index()
        {
            ProductModel objProductModel = new ProductModel();
            objProductModel.ProductData = new Product();
            objProductModel.ProductData = GetChartData();
            objProductModel.YearTitle = "Year";
            objProductModel.SaleTitle = "Sale";
            objProductModel.PurchaseTitle = "Purchase";
            return View(objProductModel);

        }
        /// <summary>
        /// Code to get the data which we will pass to chart
        /// </summary>
        /// <returns></returns>
        public Product GetChartData()
        {
            Product objproduct = new Product();
            /*Get the data from databse and prepare the chart record data in string form.*/
            objproduct.Year = "2009,2010,2011,2012,2013,2014";
            objproduct.Sale = "2000,1000,3000,1500,2300,500";
            objproduct.Purchase = "2100,1400,2900,2400,2300,1500";
            return objproduct;
        }
    }
}

查看:

 @model HealthHabitat.Models.ProductModel

<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">

    google.load("visualization", "1", { packages: ["corechart"] });
    google.setOnLoadCallback(drawChart);

    function drawChart() {
        // Create and populate the data table.
        var years = [@Model.ProductData.Year];
        var sales = [@Model.ProductData.Sale];
        var Purchase = [@Model.ProductData.Purchase];

        var data = new google.visualization.DataTable();
        data.addColumn('string', '@Model.YearTitle');
        data.addColumn('number', '@Model.SaleTitle');
        data.addColumn('number', '@Model.PurchaseTitle');
        for (i = 0; i < years.length; i++) {
            data.addRow([years[i].toString(), sales[i], Purchase[i]]);
        }
        var options = {
            title: 'Sale and Purchase Compare',
            hAxis: { title: '@Model.YearTitle', titleTextStyle: { color: 'red'} }
        };

        var chart = newgoogle.visualization.ColumnChart(document.getElementById('chartdiv'));
        chart.draw(data, options);
    }
</script>
<div id="chartdiv" style="width: 500px; height: 300px;">
</div>

【问题讨论】:

  • 嘿@StephenMuecke,你介意看看这个吗?也许你会对如何解决这个问题有更好的理解。

标签: c# asp.net-mvc database google-visualization reporting


【解决方案1】:

虽然您可以轻松地从实体生成字符串,但我将使用 Ajax 和 JSON 作为替代方案。

想象你有这样的实体模型:

public class Product
{
    public int ID {get; set; }
    public int Year { get; set; }
    public int Purchase { get; set; }
    public int Sale { get; set; }
}

在你的DbContext 中是这样的:

public class Mycontext:DbContext
{
    public IDbSet<Product> Products { get; set; }
    // other sets 
}

现在在 action 方法中,您可以删除 GetChartData(),因为我们将从 Ajax 调用中获取图表数据。

public ActionResult Index()
{
    ProductModel objProductModel = new ProductModel();
    objProductModel.YearTitle = "Year";
    objProductModel.SaleTitle = "Sale";
    objProductModel.PurchaseTitle = "Purchase";
    return View(objProductModel);
}

添加一个新的action方法来获取Ajax调用的数据:

// in real world you may add some parameters to filter your data  
public ActionResult GetChart()
{
    return Json(_myDB.Products
        // you may add some query to your entitles 
        //.Where()
        .Select(p=>new{p.Year.ToString(),p.Purchase,p.Sale}),
            JsonRequestBehavior.AllowGet);
}

现在你的视图可能是这样的:

<script type="text/javascript">

  // Load the Visualization API and the piechart package.
  google.load('visualization', '1.0', {'packages':['corechart']});

  // Set a callback to run when the Google Visualization API is loaded.
  google.setOnLoadCallback(drawChart);

  function drawChart() {
      var data = new google.visualization.DataTable();
      data.addColumn('string', '@Model.YearTitle');
      data.addColumn('number', '@Model.SaleTitle');
      data.addColumn('number', '@Model.PurchaseTitle');

      // don't forget to add JQuery in your view. 
      $.getJSON("@Url.Action("GetChart")", null, function (chartData) {
          $.each(chartData, function (i, item) {
              data.addRow([item.Year, item.Sale, item.Purchase]);
          });

          var options = {
              title: 'Sale and Purchase Compare',
              hAxis: { title: '@Model.YearTitle', titleTextStyle: { color: 'red' } }
          };

          var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
          chart.draw(data, options);
      });
  }
</script>

【讨论】:

    【解决方案2】:

    您可以尝试使用以下方式

     public Product GetChartData()
        {
            Product objproduct = new Product();
    
            List<string> yr = null;
            List<string> sal = null;
            List<string> pur = null;
    
            yr = db.tblCharts.Select(y => y.Years).ToList();
            sal = db.tblCharts.Select(y => y.Sale).ToList();
            pur = db.tblCharts.Select(y => y.Purchase).ToList();
            objproduct.Year = string.Join(",", yr);
            objproduct.Sale = string.Join(",", sal);
            objproduct.Purchase = string.Join(",", pur);
    
            return objproduct;
        }
    

    希望能解决你的问题。

    【讨论】:

    • 当你提到db.tblCharts - 这是从哪里来的?
    • 哦,因为它抛出一个错误,说它不存在。
    • 如果您需要我的帮助,请告诉我。
    • 我使用了以下 Db 脚本创建表 tblChart(Id Int 主键 Identity(1,1),Years varchar(20),Sale varchar(20),Purchase varchar(20))插入到 tblChart values(2009,2000,2100) 插入 tblChart 值(2010,1000,1400) 插入 tblChart 值(2011,3000,2900) 插入 tblChart 值(2012,1500,2400) 插入 tblChart 值(2013,2300, 2300)插入tblChart值(2014,500,1500)
    • 哦,那是你的数据表?现在在我的情况下,表格是产品,销售和采购的数字值?那么从这个意义上说,它会如何影响代码呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 2013-10-11
    • 2021-09-08
    • 2013-02-16
    相关资源
    最近更新 更多