【问题标题】:Create Charts with Chart.js Using C# string causes problems使用 Chart.js 创建图表 使用 C# 字符串会导致问题
【发布时间】:2014-10-19 10:08:31
【问题描述】:

我正在尝试在我的 asp.net 应用程序中使用 Chart Js 创建图表。我正在从代码数据库中获取数据,并根据后端的文档生成字符串。然后我调用该 Web 方法来获取图表数据并将其呈现在页面上。

 function LoadVarianceChart() {
        var data;
        $.ajax({
            type: "POST",
            url: "Analysis.aspx/GetVarianceChart",
            data: "",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (r) {
                $("#dvVarianceChart").html("");
                var obj = r.d;
                console.log(obj);
                data = obj;

                var el = document.createElement('canvas');
                $("#dvVarianceChart")[0].appendChild(el);

                //Fix for IE 8
                if ($.browser.msie && $.browser.version == "8.0") {
                    G_vmlCanvasManager.initElement(el);
                }
                var ctx = el.getContext('2d');
                ctx.canvas.width = 300;
                ctx.canvas.height = 300;
                var userStrengthsChart;
                userStrengthsChart = new Chart(ctx).Bar(data);
            },
            failure: function (response) {
                alert('There was an error.');
            }
        });
    }

这是我的 c# web 方法。

     [WebMethod]
    public static string GetVarianceChart()
    {
        DataSet ds = Utility.ExecuteDataTable("GetAdvarienceByBrandFamily", null);
        VarianceChartModel bar = new VarianceChartModel();

        bar.labels = ds.Tables[0].Rows[0][0].ToString().Split(',');
        bar.datasets = new List<datasets>();

        for (int i = 1; i < ds.Tables.Count; i++)
        {
            datasets dataset = new datasets();
            dataset.data = Array.ConvertAll(ds.Tables[i].Rows[0][0].ToString().Split(','), decimal.Parse);
            dataset.label = "new";
            dataset.fillColor = "rgba(220,220,220,0.5)";
            dataset.highlightFill = "rgba(220,220,220,0.75)";
            dataset.highlightStroke = "rgba(220,220,220,1)";
            dataset.strokeColor = "rgba(220,220,220,0.8)";
            bar.datasets.Add(dataset);
        }

        var serializer = new JsonSerializer();
        var stringWriter = new StringWriter();
        var writer = new JsonTextWriter(stringWriter);
        writer.QuoteName = false;
        serializer.Serialize(writer, bar);
        writer.Close();
        var json = stringWriter.ToString();
        return json.ToString();
    }
}

在这里,我的 Web 方法正在按照文档正确生成字符串。如果我在图表 js 中静态使用生成的字符串,那么图表会正确生成。但是当我尝试通过调用后端方法来提供相同的字符串时,它给了我 Uncaught TypeError: Cannot read property 'length' of undefined

我不知道为什么它对同一个字符串会这样。这与 C# 字符串和 java 脚本字符串兼容性有关吗?

【问题讨论】:

  • 我的意思是你需要检查chart.js的数据格式请求,可能需要一些对象的长度属性,并且可能会丢失。
  • 是的。如果我将 console.log 字符串直接提供给 chart.js,那么它工作正常。但是,如果我通过调用我发布的方法来提供它,那么它会引发错误。所以 console.log(obj);字符串真的很好

标签: javascript c# asp.net charts


【解决方案1】:

我发现了这个问题。这是让您通过使用 asp.net 从数据库获取数据来创建图表的代码。

function LoadChart1() {
        var data;
        $.ajax({
            type: "POST",
            url: "Analysis.aspx/GetChart1",
            data: "{account: '" + $("[id*=ddlAccount]").val() + "'}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (r) {
                $("#dvChart").html("");
                $("#dvLegend").html("");
                var obj = r.d;
                data = JSON.parse(obj);

                var el = document.createElement('canvas');
                $("#dvChart")[0].appendChild(el);

                //Fix for IE 8
                if ($.browser.msie && $.browser.version == "8.0") {
                    G_vmlCanvasManager.initElement(el);
                }
                var ctx = el.getContext('2d');
                ctx.canvas.width = 500;
                ctx.canvas.height = 500;
                var userStrengthsChart;
                userStrengthsChart = new Chart(ctx).Bar(data);
            },
            failure: function (response) {
                alert('There was an error.');
            }
        });
    }

这是向图表提供数据的网络方法。

[WebMethod]
    public static string GetChart1(string account)
    {
        SqlParameter[] param = new SqlParameter[] { new SqlParameter("@account", account) };
        DataSet ds = Utility.ExecuteDataTable("GetChart1", param);
        if (ds.Tables[0].Rows.Count != 0)
        {
            VarianceChartModel bar = new VarianceChartModel();
            bar.labels = ds.Tables[0].Rows[0][0].ToString().Split(',');
            bar.datasets = new List<datasets>();

            for (int i = 1; i < ds.Tables.Count; i++)
            {
                string data = ds.Tables[i].Rows[0][0].ToString();
                if (!string.IsNullOrEmpty(data))
                {
                    datasets dataset = new datasets();
                    dataset.data = Array.ConvertAll(data.Split(','), decimal.Parse);
                    dataset.label = "new";
                    dataset.fillColor = "rgba(255, 102, 0,0.5)";
                    dataset.highlightFill = "rgba(255, 102, 0,0.75)";
                    dataset.highlightStroke = "rgba(255, 102, 0,0.50)";
                    dataset.strokeColor = "rgba(255, 102, 0,0.8)";
                    bar.datasets.Add(dataset);
                }
            }

            var serializer = new JsonSerializer();
            var stringWriter = new StringWriter();
            var writer = new JsonTextWriter(stringWriter);
            // writer.QuoteName = false;
            serializer.Serialize(writer, bar);
            writer.Close();
            var json = stringWriter.ToString();
            return json.ToString();
        }
        else
        {
            return null;
        }
    }

【讨论】:

  • 也许使用 ashx 样本?
  • 如果您能出示 VarianceChartModeldatasets 类的声明将不胜感激
【解决方案2】:
Here is the code it worked for me.For the bar chat
 <script type="text/javascript">
            var getchartdata = function () {
                debugger;
                var obj = {};
                obj.datefromt = $.trim($("[id*=txtfrom]").val());
                obj.datetot = $.trim($("[id*=txtto]").val());
                //obj.costtype = document.getElementById('drpcostytpe').value;
                $.ajax({
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    url: "PublisherPayoutJschat.aspx/GetDataonclick",
                    data: JSON.stringify(obj),
                    async: true,
                    cache: false,
                    dataType: "json",
                    success: OnSuccess_,
                    error: OnErrorCall_
                })
                function OnSuccess_(reponse) {
                    var aData = reponse.d;
                    var aLabels = aData[0];
                    var aDatasets1 = aData[1];
                    var aDatasets2 = aData[2];
                    var barChartData = {
                        labels: aLabels,
                        datasets: [
                            {
                                label: "Date",
                                //fill:false,
                                fillColor: "#006495",
                                strokeColor: "rgba(220,220,220,1)",
                                pointColor: "rgba(200,122,20,1)",
                                data: aDatasets1
                            },
                            {
                                label: "Topup",
                                fillColor: "#004C70",
                                strokeColor: 'rgba(220,180,0,1)',
                                pointColor: 'rgba(220,180,0,1)',
                                data: aDatasets2
                            },

                        ]
                    }
                    var helpers = Chart.helpers;
                    var canvas = document.getElementById('chart_div');
                    var bar = new Chart(canvas.getContext('2d')).Bar(barChartData, {
                        responsive: false,
                        maintainAspectRatio: true,
                        animation: false
                    });
                    // 
                    document.getElementById('legend').innerHTML = "";
                    var legendHolder = document.createElement('div');
                    legendHolder.innerHTML = bar.generateLegend();
  document.getElementById('legend').appendChild(legendHolder.firstChild);
                }
                function OnErrorCall_(repo) {
                    alert(repo);
                }
            }
             </script>

---cs file
//GetDatachat for chart search data
        [WebMethod]
    public static List<object> GetDataonclick(string datefromt, string datetot)
        {
            string publisherid = "2000021";
            DataTable dt = new DataTable();

            List<object> iData = new List<object>();
            PublisherJavascriptDAL objpayout = new PublisherJavascriptDAL();
            dt = objpayout.Getbarchatpayout(publisherid, datefromt, datetot);
     string[] columnNames = dt.Columns.Cast<DataColumn>                        ().Select(x=>x.ColumnName).ToArray();
            Array.Reverse(columnNames);
            foreach (string dc in columnNames)
            {
                List<string> labels = new List<string>();
                List<double> lst_dataItem_1 = new List<double>();
                for (int j = 0; j < dt.Rows.Count; j++)
                {
                    if (dc == "TXdatetime")
                    {
                        labels.Add(dt.Rows[j]["TXdatetime"].ToString());
                        //iData.Add(labels);
                    }
                    else
                    {
                        lst_dataItem_1.Add(Convert.ToDouble(dt.Rows[j][dc].ToString()));
                    }
                }
                if (dc == "TXdatetime")
                    iData.Add(labels);
                else
                    iData.Add(lst_dataItem_1);

            }

            return iData;
        }

【讨论】:

    猜你喜欢
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2016-11-06
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    相关资源
    最近更新 更多