Telerik MVC Chart ClientEvents.OnDataBinding

时间:2011-08-22 12:39:51

标签: asp.net-mvc charts telerik

我想显示针对特定民意调查问题的民意调查结果。 单击问题列表时,我想根据所选的questionId将我的图表与查询绑定。

所以我的计划是; 1.从选定的问题行中获取问题。没关系。

  1. 在我的图表上定义ClientEvents.OndataBinding事件。所以我能够 传递问题与;

    function onChartDataBinding(e){         e.data = $ .extend(e.data,{questionId:questionId});     }

  2. 在问题列表网格行选定事件上使用$('#ChartPollResults').data('tChart').rebind();

  3. 当根据第一个网格选定行进行第二次网格绑定时,此方案有效。 但似乎图表控件上没有ClientEvents.OnDataBinding事件。 图表控件不支持“rebind()”方法。

    我使用的图表控件如下。

    @(Html.Telerik().Chart<QuestionResult>()
                                .Theme("WebBlue")
                                .Name("ChartPollResults")
                                .Title("Poll Question Choice Number vs. Choice Count")
                                .Legend(legend => legend.Position(ChartLegendPosition.Bottom))
                                .Series(series =>
                                {
                                    series.Bar("ChoseCount").Name("Choice Count").Gap(5);
                                })
                                .CategoryAxis(axis => axis.Categories(o => o.ChoiceNumber))
    
                                .DataBinding(dataBinding => dataBinding.Ajax().Select("_PollResultChartBinding", "Poll", new { questionId = 0 }))
                                .HtmlAttributes(new { style = "width: %100px; height: 270px" })
                        )
    

    我的控制器绑定方法;

    public ActionResult _PollResultChartBinding(int questionId = 0)
    {
                //questionId = 3;
                if (!ModelState.IsValid || questionId == 0)
                    return Json(new List<QuestionResult>());
    
                PollQuestionDefinition pollQuestion = service.Get(questionId);
                List<PollAnswer> pollAnswers = service.GetPollAnswersByQuestion(questionId);
                PollQuestionResultUI result = new PollQuestionResultUI(pollQuestion, pollAnswers);
    
                return Json(result.Results);
    }
    

    当我注释掉//questionId = 3;行时,我可以在图表中看到问题的结果,并且没有问题。

    但我无法将问题传递给图表。

    提前致谢。

2 个答案:

答案 0 :(得分:2)

这是我对你的源代码的意见应该是这样的:

//controller binding method

    public ActionResult _PollResultChartBinding(string questionId)
    {
                //questionId = 3;
      int _questionId = String.IsNullOrEmpty(questionId) ? 0 : Convert.ToInt32(questionId);

                if (_questionId == 0)
                    return Json(new List<QuestionResult>());

                PollQuestionDefinition pollQuestion = service.Get(_questionId);
                List<PollAnswer> pollAnswers = service.GetPollAnswersByQuestion(_questionId );
                PollQuestionResultUI result = new PollQuestionResultUI(pollQuestion, pollAnswers);

                return Json(result.Results);
    }

**in your view, there is no problem with the code**.
but, for rebind that chart, this is the code :

example : (running from developer console for IE or firebug for firefox browser)

    var chartPollResult = $('#ChartPollResults').data('tChart');
    chartPollResult.rebind({ questionId: "0"});

but if you want make it into function, code should be like this:

    function rebindChartPollResult(e, param) { 
      e.data('tChart').rebind({ questionId: param});
    }

calling method :

    rebindChartPollResult($('#ChartPollResults'), "0");

参考telerik图表ajax绑定(不包括如何重新绑定图表): http://demos.telerik.com/aspnet-mvc/chart/ajaxbinding

答案 1 :(得分:1)

首先,我立即注意到的一件事是你在ActionResult参数中将questionId设置为0。我实际上刚刚修改了一张我已经运行并运行的图表

new { questionID = 0}

作为我的Ajax select语句的附加参数,并且传递得很好。

至于传递参数,您可以考虑在网格选择上使用POST到服务器并以这种方式传递参数。我知道这里可能不太理想,但理论上您可以在该帖子中填充图表,或者只是设置一个ViewData条目以包含您正在寻找的特定questionID。

我还注意到你已将此提交给Telerik forums,并且从响应中可以看出上述方法实际上可能工作得很好,或者你可以使用那里提到的方法(带有ajax调用的局部视图)