c# - Chart.JS 标签字符串不能接受 ViewBag 数据

标签 c# asp.net-core

我正在 ASP.NET Core MVC 中开发一个简单的应用程序,我正在应用 Chart.js 来呈现图形图表。
问题出现在 x 轴的标签上。当我像这样用 JavaScript 手动编写时,一切都完成了:

labels: ['January', 'February', 'March'],

但是当我像这样调用@ ViewBag.Exponate 时它不会显示:

@Html.Raw(ViewBag.Exponate)

Controller 代码如下:

 var recordList = _db.OrderHeader.Where(u=>u.UserId==sain.Value && u.ShopId==Convert.ToInt32(_LoadSessions)).GroupBy(x => x.OrderDate.ToString("MMMM"))
                .Select(x => x.FirstOrDefault())
                .ToList();
            List<string> monthlists = recordList.Select(x => x.OrderDate.ToString("MMMM")).ToList();
                ViewBag.Exponate = string.Join(",", monthlists);

            var summation = _db.OrderHeader.Where(u => u.UserId == sain.Value && u.ShopId == Convert.ToInt32(_LoadSessions)).GroupBy(x => x.OrderDate)
                .Select(x => new
                {
                    countIf = x.Sum(y => y.OrderTotal)
                }).ToList();

            List<string> values = summation.Select(x => x.countIf.ToString()).ToList();
            ViewBag.valuesX= string.Join(",", values);

这是 View :

<script src="~/Charts/Chart.bundle.js"></script>
<script src="~/Charts/utils.js"></script>

<style>

    canvas {
        -moz-user-select: none;
        -webkit-user-select: none;
        -ms-user-select: none;
    }
</style>

<div style="width:100%; color:white">
    <canvas id="canvas" style="background-color:#e8e2e2"></canvas>
</div>
<br>
<br>

<script>
        var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
        var config = {
            type: 'bar',
            data: {
                labels: [@Html.Raw(ViewBag.Exponate)],
                datasets: [{
                    label: 'My First dataset',
                    backgroundColor: window.chartColors.red,
                    borderColor: window.chartColors.red,
                    data: [
                      @ViewBag.valuesX
                    ],
                    fill: false,
                }, {
                    label: 'My Second dataset',
                    fill: false,
                    backgroundColor: window.chartColors.blue,
                    borderColor: window.chartColors.blue,
                    data: [
                        @ViewBag.valuesX 
                    ],
                }]
            },
            options: {
                responsive: true,
                title: {
                    display: true,
                    text: 'Chart.js Line Chart'
                },
                tooltips: {
                    mode: 'index',
                    intersect: false,
                },
                hover: {
                    mode: 'nearest',
                    intersect: true
                },
                scales: {
                    xAxes: [{
                        display: true,
                        scaleLabel: {
                            display: true,
                            labelString: 'Month'
                        }
                    }],
                    yAxes: [{
                        display: true,
                        scaleLabel: {
                            display: true,
                            labelString: 'Value'
                        }
                    }]
                }
            }
        };

        window.onload = function () {
            var ctx = document.getElementById('canvas').getContext('2d');
            window.myLine = new Chart(ctx, config);
        };


</script>

那么问题来了:

labels: [@Html.Raw(ViewBag.Exponate)],

如果我这样输入:

labels: ['January', 'February', 'March'],

有效。

但我不想这样。我希望从我的 Controller 列表对象中加载标签,如下所示:

labels: [@Html.Raw(ViewBag.Exponate)],

我怎样才能做到这一点?

最佳答案

您的序列化没有生成有效的 JavaScript 数组。相反,它产生这样的输出:

<script type="text/javascript">
    let data = {
        labels : January,February,March
    };
</script>

你想要的是一个 JavaScript 字符串数组:

<script type="text/javascript">
    let data = {
        labels : ["January","February","March"]
    };
</script>

解决方案:使用 Newtonsoft.Json 进行序列化。例如。

public IActionResult Index()
{
    var monthlists = new List<string> { "January", "February", "March" };

    // ViewBag.Exponate = string.Join(",", monthlists);

    ViewBag.Exponate = 
        Newtonsoft.Json.JsonConvert.SerializeObject(monthlists);

    return View();
}

当您这样做时,以下内容将生成有效的 JavaScript 数组。

<script type="text/javascript">
    let data = {
        labels : @Html.Raw(ViewBag.Exponate)
    };
</script>

关于c# - Chart.JS 标签字符串不能接受 ViewBag 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51432576/

相关文章:

c# - 将第一个数字替换为一个字节中的第二个数字

c# - 如何在asp.net core razor页面中拒绝匿名用户?

asp.net - 如何运行已发布的 Asp.Net core Web 应用程序

sql-server - 使用 SQL Management Studio 连接到 Linux (docker) 上的 SQL Server

asp.net-core - 为什么 Bind 属性似乎破坏了嵌套对象的模型绑定(bind)?

C# P/调用键盘事件

c# - Sharepoint:SPweb.Groups.GetByName(groupName) 抛出异常

c# - 如何在管理控制台中打开所选对象的属性对话框?

c# - 我可以使用 ExecuteScalar 进行更新吗?

ASP.Net Core 2 ServiceProviderOptions.ValidateScopes 属性