c# - Razor foreach 循环和 javascript

标签 c# javascript asp.net-mvc razor

请帮忙。我用 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);
        }

最佳答案

您的代码中有一些错误:

  1. 您正在输入字符串“item.Item1”而不是属性 Item1 的值变量 item 。使用'@(item.Item1)'相反。

  2. 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 查询,因此不接受在查询中使用带有参数的构造函数。 WhereSelect上述子句组合成一个 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/

相关文章:

c# - 如何在所有 Azure 可用实例上分派(dispatch) Hangfire 作业?

c# - 操纵字符串

c# - 有没有更简单/更好的方法来做到这一点,因为 C# 中不允许向下转型?”

asp.net-mvc - DropDownListFor ... 选定的值

c# - DataTable 表达式无法解释标记 '!'

javascript - 客户端未收到页面发送的电子邮件

javascript - 当使用 element.style = <some CSSStyleDeclaration> 使元素消失

javascript - 从给定的可变文本中的节点 HTML 中获取文本

ajax - 使用带有下拉列表 mvc3 的 ajax

ajax - ASP.NET MVC 中 MicrosoftAjax.js 的脚本全局化怎么样?