Razor foreach loop and javascript
本文关键字:javascript and loop foreach Razor | 更新日期: 2024-09-21 21:26:33
请提供帮助。我用剃须刀头疼。我正在尝试使用谷歌图表来显示我的信息。
所以,这就是我的观点:
@section scripts
{
<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() {
var data = google.visualization.arrayToDataTable([
['Date', 'DDM'],
@foreach(var item in Model.ToList())
{
<text>
['item.Item1', 'item.Item2']
</text>
}
]);
var options = {
title: 'Demande de marché',
hAxis: { title: 'Date', titleTextStyle: { color: '#333'} }
};
var chart = new google.visualization.AreaChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
</script>
}
我使用foreach循环对模型(IEnumerable<Tuple<DateTime,int>>
)进行迭代,以在javascript函数中添加信息。在设计时,我得到
Conditional compilation is turned off
有人知道怎么解决这个问题吗?
感谢
编辑:这是控制器:
public ActionResult DDMPerDepartment(string department)
{
if (DepartmentsList == null) DepartmentsList = _db.Departments.ToList();
ViewBag.DepartmentString = DepartmentsList.First().DepartmentName;
IEnumerable<Tuple<DateTime,int>> points = _db.DepartmentNumbers.Where(x => x.Department.Id == 1).Select(x => new Tuple<DateTime, int>(x.Date, x.Number));
return View(points);
}
您在代码中有一些错误:
-
您正在放入字符串"item.Item1",而不是变量
item
的属性Item1
的值。请改用'@(item.Item1)'
。 -
在
foreach
循环中,每个项目的末尾都缺少一个逗号。因此,注入的javascript无效。你需要<文本>['@(item.Item1)','@(item.Item2)'],<文本>
编辑:
好的,所以问题出在上面的LINQ到实体查询中。
IEnumerable<Tuple<DateTime,int>> points = _db.DepartmentNumbers.Where(x => x.Department.Id == 1).Select(x => new Tuple<DateTime, int>(x.Date, x.Number));
实体框架需要能够将此查询转换为SQL查询,因此不接受在查询中使用带参数的构造函数。上面的Where
和Select
子句组合成一个SQL查询。
一种可能的解决方法是首先计算表达式中需要在数据库上运行的部分,将数据返回内存,然后在内存中创建元组。LINQ方法有很多重载,其中一些重载为实体的LINQ创建表达式,一些重载在内存中执行LINQ操作。您需要确保创建元组的select在内存中执行,即您不希望应用于IQueryable<T>
的重载。
IEnumerable<Tuple<DateTime,int>> points = _db.DepartmentNumbers
.Where(x => x.Department.Id == 1) // LINQ to Entities WHERE
.Select(x => new { x.Date, x.Number }) // LINQ to Entities SELECT
.AsEnumerable() // We want the next statement to be a select on IEnumerable instead of IQueryable.
.Select(x => new Tuple<DateTime, int>(x.Date, x.Number)); // In-memory SELECT