如何在ASP.NET MVC中通过JSON同时向视图传递两个数组?
解决方案:同时返回两个数组用于Chart.js渲染
没问题,这个需求很好实现——你只需要把product和quant两个数组打包成一个统一的对象返回,而非单独返回某一个数组。JSON支持传递复杂对象,所以这完全可行,下面是具体修改步骤:
1. 修改控制器代码,返回包含两个数组的对象
原来的控制器只返回了product数组,现在我们把两个数组封装到一个匿名对象中,这样前端就能一次性拿到所有需要的数据:
public ActionResult DoChart(string data) { string[] product = {"Bread", "Milk", "Eggs", "Butter"}; int[] quant = {10, 20, 30, 40}; // 将两个数组包装到一个匿名对象里,属性名可以自定义,保持前后端一致即可 var chartResponse = new { Labels = product, DataValues = quant }; return Json(chartResponse, JsonRequestBehavior.AllowGet); }
2. 调整前端JavaScript,解析返回的对象
在AJAX的success回调里,我们现在接收的是一个包含两个数组的对象,直接通过对象的属性就能分别获取标签和数据值,然后传入Chart.js的配置中:
<script> $(() => { $("form#chartForm").on("submit", (e) => { e.preventDefault(); let obj = { quantity: $("#quantity").val() }; $.ajax({ url: "@Url.Action("DoChart")", method: "GET", data: { data: JSON.stringify(obj) }, success: (response, status) => { // 现在response包含Labels和DataValues两个数组 console.log("Labels:", response.Labels); console.log("Data:", response.DataValues); var ctx = document.getElementById('myChart').getContext('2d'); var myChart = new Chart(ctx, { type: 'bar', data: { labels: response.Labels, // 使用返回的标签数组 datasets: [{ label: '# of Votes', data: response.DataValues, // 使用返回的数据值数组 borderWidth: 1 }] }, options: { scales: { yAxes: [{ ticks: { beginAtZero: true } }] } } }); } }); }); }); </script>
额外说明
如果你需要更规范的代码(比如大型项目),也可以创建一个强类型的DTO类(比如
ChartDataDto)来封装这两个数组,效果和匿名对象一样,但可读性和可维护性更好:public class ChartDataDto { public string[] Labels { get; set; } public int[] DataValues { get; set; } }然后控制器返回
new ChartDataDto { Labels = product, DataValues = quant }即可。确保前后端的属性名完全一致(比如控制器里的
Labels对应前端的response.Labels),否则会出现取不到值的情况。
内容的提问来源于stack exchange,提问作者Vassilis
相关产品推荐
相关产品推荐

