请帮忙。我用 Razor 就头疼。我正在尝试使用谷歌图表来显示我的信息。
所以,这就是我的观点:
@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
有人知道如何解决这个问题吗?
谢谢
编辑: 这是 Controller :
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”而不是属性
Item1
的值变量item
。使用'@(item.Item1)'
相反。foreach
中每个项目末尾缺少一个逗号。环形。因此注入(inject)的 JavaScript 是无效的。你需要['@(item.Item1)', '@(item.Item2)'],
编辑:
好的,所以问题出在上面的 LINQ toEntity 查询中。
IEnumerable<Tuple<DateTime,int>> points = _db.DepartmentNumbers.Where(x => x.Department.Id == 1).Select(x => new Tuple<DateTime, int>(x.Date, x.Number));
Entity Framework 需要能够将此查询转换为 SQL 查询,因此不接受在查询中使用带有参数的构造函数。 Where
和Select
上述子句组合成一个 SQL 查询。
一种可能的解决方法是首先评估需要在数据库上运行的表达式部分,将数据返回到内存,然后在内存中创建元组。 LINQ 方法有许多重载,其中一些为 LINQ to 实体创建表达式,一些在内存中执行 LINQ 操作。您需要确保创建元组的选择在内存中执行,即您不希望适用于 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
关于c# - Razor foreach 循环和 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20546702/