在视图中从JavaScript访问模型中的数据

时间:2016-04-19 08:25:28

标签: jquery asp.net asp.net-mvc

我对ASP.NET的了解非常有限且是新的,所以请更正我无法理解的任何内容。

我目前正在使用Google Charts生成一组图表,但每次我都在查询数据库中的同一组数据。我想将其存储在某处或仅检索一次数据以提高性能。

我查看了缓存,但每次我的脚本移动到下一个图表时,数据都不再存在于缓存中。所以我的另一个想法是获取数据一次,为所有图表生成JSON字符串,并将它们存储在模型中。然后我可以通过'Model.chart1 - Model.chart2'等获得数据。

但是,我似乎无法在我的视图中从Javascript访问此数据。我可以通过将'@ Model.chart1'放在div容器中来从html到达那里。

所需的行为是从JQuery函数内部访问此数据,如下所示。但是不是从控制器调用方法,而是直接访问模型字段,如'var chart1 = @ Model.chartOne'

<script type="text/javascript">

    google.charts.load('current', { 'packages': ['corechart'] });
    google.charts.setOnLoadCallback(drawChartOne);
    google.charts.setOnLoadCallback(drawChartTwo);

    function drawChartOne() {

        var jsonData = $.ajax({
            url: "/Controller/GetChartOne",
            dataType: "json",
            async: false
        }).responseText;

        var options = {

            title: 'Chart One',

            hAxis: {
                title: 'Date'
            },

            vAxis: {
                title: 'Hours'
            },

            explorer: {
                keepInBounds: true
            },

            height: 500,
            width: 1000

        };

        var data = new google.visualization.DataTable(jsonData);

        var chart = new google.visualization.LineChart(document.getElementById('ChartOne'));
        chart.draw(data, options);

    }

    function drawChartTwo() {

        var jsonData = $.ajax({
            url: "/Controller/GetChartTwo",
            dataType: "json",
            async: false
        }).responseText;

        var options = {

            title: 'Chart Two',

            hAxis: {
                title: 'Date'
            },

            vAxis: {
                title: 'Hours'
            },

            explorer: {
                keepInBounds: true
            },

            height: 500,
            width: 1000

        };

        var data = new google.visualization.DataTable(jsonData);

        var chart = new google.visualization.LineChart(document.getElementById('ChartTwo'));
        chart.draw(data, options);

    }
    </script>

1 个答案:

答案 0 :(得分:0)

我通过一些关于正确使用MVC的阅读和教育来解决这个问题。

我最终创建了一个名为&#34; Graph&#34;的基础模型类,然后是GraphOne和GraphTwo的另外两个模型,它们都继承自Graph。

然后我创建了一个ViewModel,它存储了一个Graph类型的列表。这意味着我可以将所有不同的图形存储在一个列表中,以便从JavaScript中进行访问。

从控制器,根据请求,我可以加载一次数据,然后将数据传递给每个GraphOne和GraphTwo进行各自的处理。重要的是,只加载一次数据。然后我将ViewModel作为ActionResult返回,然后可以使用.cshtml类中的强类型数据类型访问我需要的属性。

可能是一个非常糟糕的解释,但希望它会帮助某人。我在ASP MVC上找到一个不错的教程有点困难。这是我遵循的非常好的系列,并建议: http://www.codeproject.com/Articles/866143/Learn-MVC-step-by-step-in-days-Day