我想显示针对特定民意调查问题的民意调查结果。 单击问题列表时,我想根据所选的questionId将我的图表与查询绑定。
所以我的计划是; 1.从选定的问题行中获取问题。没关系。
在我的图表上定义ClientEvents.OndataBinding事件。所以我能够 传递问题与;
function onChartDataBinding(e){ e.data = $ .extend(e.data,{questionId:questionId}); }
在问题列表网格行选定事件上使用$('#ChartPollResults').data('tChart').rebind();
。
当根据第一个网格选定行进行第二次网格绑定时,此方案有效。
但似乎图表控件上没有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;
行时,我可以在图表中看到问题的结果,并且没有问题。
但我无法将问题传递给图表。
提前致谢。
答案 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调用的局部视图)