【问题标题】:How to load a JQuery function after execute with button?使用按钮执行后如何加载 JQuery 函数?
【发布时间】:2014-03-25 11:39:38
【问题描述】:

我是 JQuery 的新手,被困在 atm 上。我有一个从 Google API 绘制图表的 MVC 应用程序。我正在开发一个 UI,它允许用户从 DropDownList 中选择一个项目,单击运行,图表将加载。我当前的问题是当我转到视图时图表直接运行。绘制图表的 JQuery 函数实现了 GAStatisticsController 中的 GetData ActionResult。

我有一个下拉列表,其中包含来自模型类的可选项目和一个按钮(“GAStatisticsReport-Submit”)。我只需要检查是否在 DropDownList 中选择了“访问者”项,如果是这种情况,我可以单击运行,图表将显示访问者的数据。我怎么能存档呢?

控制器有一个名为 CreateGAStatisticsReport 的方法,它将数据返回到视图以供图表显示。此方法有一个 ActionResult。然而,当函数绘制图表时,它是从 GetData ActionResult 而非 GAStatistics 中绘制的。

这里是视图:

<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
    google.load("visualization", "1", { packages: ["corechart"] });
    google.load("visualization", "1", { packages: ["treemap"] });
    google.setOnLoadCallback(drawChart);
    function drawChart() {
        $.get('/GAStatistics/GetData', {}, <--- here's GetData ActionResult in the Controller
            function (data) {
                var tdata = new google.visualization.DataTable();

                tdata.addColumn('date', 'Datum');
                tdata.addColumn('number', 'Besökare');

                for (var i = 0; i < data.length; i++) {
                    var dateStr = data[i].Date.substr(0, 4) + "-" + data[i].Date.substr(4, 2) + "-" + data[i].Date.substr(6, 2);
                    tdata.addRow([new Date(dateStr), parseInt(data[i].Visitors)]);
                }

                var options = {
                    title: "Number of unique visitors"
                };

                var chart1 = new google.visualization.AreaChart(document.getElementById('chart_div1'));
                var chart2 = new google.visualization.LineChart(document.getElementById('chart_div2'));
                var chart4 = new google.visualization.ColumnChart(document.getElementById('chart_div4'));

                chart1.draw(tdata, options);
                chart2.draw(tdata, options);
                chart4.draw(tdata, options);
            });
    }

</script>

<table class="adminContent">
         <tr>
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.StartDate):
            </td>
            <td class="adminData">
                @Html.EditorFor(model => model.StartDate)
            </td>
        </tr>
        <tr>
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.EndDate):
            </td>
            <td class="adminData">
                @Html.EditorFor(model => model.EndDate)
            </td>
        </tr>
        <tr>
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.GAStatisticsId ):
            </td>
            <td class="adminData">
                @Html.DropDownList("GAStatisticsId", Model.AvailableGAStatistics)
                <input type="button" id="GAStatisticsReport-Submit" class="t-button" value="@T("Run")" />
        </tr>
</table>

我的 ViewModel(注意:当 SelectListItem "Visitors 被选中并且用户点击了 "Run" 按钮时,它应该执行并绘制图表):

    public class GAStatisticsListModel : BaseNopModel
    {
        public GAStatisticsListModel()
        {
            AvailableGAStatistics = new List<SelectListItem>();

            SelectListItem Visitors = new SelectListItem() { Text = "Besökare", Value = "1", Selected = false };
            SelectListItem PercentNewVisitors = new SelectListItem() { Text = "Nya Besökare (Procent)", Value = "2", Selected = false };
            SelectListItem ConversionRate = new SelectListItem() { Text = "Konverteringsgrad", Value = "3", Selected = false };



            AvailableGAStatistics.Add(Visitors);
            AvailableGAStatistics.Add(PercentNewVisitors);
            AvailableGAStatistics.Add(ConversionRate);
        }


        [NopResourceDisplayName("Admin.ShopStatistics.List.StartDate")]
        [UIHint("DateNullable")]
        public DateTime? StartDate { get; set; }

        [NopResourceDisplayName("Admin.ShopStatistics.List.EndDate")]
        [UIHint("DateNullable")]
        public DateTime? EndDate { get; set; }

         [NopResourceDisplayName("Admin.GAStatistics.GAStatistics.GAStatisticsList")]
        public int GAStatisticsId { get; set; }

        public List<SelectListItem> AvailableGAStatistics { get; set; }

    }
}

控制器(GetData 将数据从 CreateGAStatisticsReport 传递到视图中的 JQuery 代码以显示图表):

public class GAStatisticsController : Controller
    {

        //GET: /ShopStatistics/
        [HttpPost]
        public ActionResult GetData() 
        {
            return Json(CreateGAStatisticsReport(), JsonRequestBehavior.AllowGet);
        }



        public ActionResult GAStatistics()
        {
            return View(new GAStatisticsListModel());
        }


        private List<GAStatistics> CreateGAStatisticsReport()
        {

            var serviceAccountEmail = "xxxxxxxxx@developer.gserviceaccount.com";
            var certificate = new X509Certificate2(@"C:\Users\Desktop\NopCommerce\Presentation\Nop.Web\key.p12", "notasecret", X509KeyStorageFlags.Exportable);


            var credential = new ServiceAccountCredential(
            new ServiceAccountCredential.Initializer(serviceAccountEmail)
            {
                Scopes = new[] { AnalyticsService.Scope.Analytics }
            }.FromCertificate(certificate));

            // Create the service.
            //Twistandtango
            var GoogleAnalyticsService = new AnalyticsService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = "MyApp",
            });

            var request = GoogleAnalyticsService.Data.Ga.Get("ga:xxxxxxxx", "2014-01-24", "2014-01-30", "ga:visitors");
            //Specify some addition query parameters
            request.Dimensions = "ga:date";
            request.Sort = "-ga:date";
            request.MaxResults = 10000;

            //Execute and fetch the results of our query
            Google.Apis.Analytics.v3.Data.GaData d = request.Execute();


            List<GAStatistics> ListGaVisitors = new List<GAStatistics>();

            foreach (var row in d.Rows)
            {

                GAStatistics GaVisits = new GAStatistics(row[0], row[1]);
                ListGaVisitors.Add(GaVisits);

            }


            return ListGaVisitors;

        }
    }

【问题讨论】:

    标签: c# jquery ajax asp.net-mvc razor


    【解决方案1】:

    对于您想要的,您不能使用 google.setOnLoadCallback(drawChart) (请参阅 this link 了解原因)。如果我理解您想要做什么,您必须在按钮上设置一个事件,该事件将执行 drawChart() 函数。

    像这样:

    $("#GAStatisticsReport-Submit").click(function(){ drawChart() })
    

    因此,当您单击该按钮时,将绘制图表。 要仅在选择“访客”时绘制图表,您必须执行以下操作:

    $("#GAStatisticsReport-Submit").click(function(){ 
        if($("select[name='GAStatisticsId'] option:selected").text()=="Visitors")
            drawChart() 
    })
    

    【讨论】:

    • 谢谢,这很有帮助。是的。我还必须防止在单击按钮之前绘制图表。
    • 非常感谢。现在单击按钮时会绘制图表。它还没有将图表连接到 SelectListItem 但我到了那里。正如你所说的那样,在使用 Google.SetOnLoadOnCallback 时该功能将无法正常工作,当我想到它时,它是非常自我解释的 duh.. 我真的必须学习更多的 javascript,这太可怕了。再次感谢 =)
    • 我很乐意提供帮助。如果我能提供任何其他帮助,你可以指望我
    猜你喜欢
    • 2019-10-27
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    相关资源
    最近更新 更多