我是新加入ASP.NET MVC的,我在自己的项目上做,我有一些问题。我想用数据库的数据来绘制线状图。
我希望你能理解我(糟糕的英语,对不起):
我有一张金属表,在我点击具体的金属表后,我想看一看按日期显示金属价格的图表。
例如,我点击铜;
PricePoint是我的控制器,我应该打电话给这里吗?
<a href="@Url.Action("DrawChart", "PricePoint", new { id = item.ID })">@Html.DisplayFor(modelItem => item.name)</a>我在DrawChart控制器中调用PricePoint操作:
public ActionResult DrawChart()
{
return View();
}在同一个控制器中,我创建了将数据从数据库添加到json并返回数据的操作。
public ActionResult Statistics(int ?id) {
// here i pull data from database to stats
return Json(stats,JsonRequestBehavior.AllowGet);
}这是我想要显示图表的视图页面,DrawChart.cshtml文件。
<script type="text/javascript">
$.get('@Url.Action("Statistics")', function(result){
new Morris.Line({
// ID of the element in which to draw the chart.
element: 'myfirstchart',
// Chart data records -- each entry in this array corresponds to a point on
// the chart.
data: [
result
],
// The name of the data record attribute that contains x-values.
xkey: 'year',
// A list of names of data record attributes that contain y-values.
ykeys: ['value'],
// Labels for the ykeys -- will be displayed when you hover over the
// chart.
labels: ['Value']
});
});
</script>当我单击DrawChart动作返回视图DrawChart.cshtml时,JavaScript运行统计函数并填充图表的数据,这是如何工作的吗?
我有空白页,没有结果,当我输入url:http://localhost:50101/PricePoint/DrawChart时,当url是下一个时,我从数据库:http://localhost:50101/PricePoint/Statistics中看到json数据。
我不知道哪里有问题。当我将示例数据放入脚本中时,如下所示
data: [
{ year: '2008', value: 20 },
{ year: '2009', value: 10 },
{ year: '2010', value: 5 },
{ year: '2011', value: 5 },
{ year: '2012', value: 20 }
],我看到了预期的线图。再次,对不起,英语不好,希望你能帮助我,我希望你理解我的问题。
发布于 2015-07-26 00:12:52
我玩了一玩,还把图表显示得很好。这里有几件事情需要注意,这可能是你的问题的原因:
1)对$.get('@Url.Action("Statistics")'的调用并不是传递一个id,尽管您在操作public ActionResult Statistics(int ?id)上声明了一个id。考虑到它是可空的,也许您已经准备好在没有传递id的情况下提供默认的数据集,但是我想我要说的是,如果这影响到数据库检索的逻辑并影响返回的结果
2)我注意到,指向DrawChart操作的链接是在new { id = item.ID }中传递的,但是这在服务器端并没有捕获,因为您的DrawChart操作缺少了参数,所以应该是:public ActionResult DrawChart(id)。我知道这可能是为了把它简化成张贴在这里,可能不会影响任何事情,但我想我会指出。
3)小心您从MVC操作返回的内容。return Json(stats,JsonRequestBehavior.AllowGet);中的stats对象应该是包含数组中每个对象的属性值和年份的C#数组,如下所示:
new[] {new Entry() {value = 20, year = 2008}, new Entry() {value = 10, year = 2009}};如果您只是将一个字符串传递给返回Json()语句,它将不能正常工作,因为它会认为它只是一个长的json字符串,而不是json数组对象。
如果希望返回字符串,而不是实际序列化的c#集合,则可以使用以下内容:return Content(dataString, "application/json");
4)案件重要!确保返回的json包含每个条目的名称为年份和值的属性,就像在xkey和ykey值上在morris对象中声明的那样。这可能是一个非常微妙的陷阱,因为返回Json()将像类中声明的那样序列化json对象,而javascript代码的趋势是以.Net中小写的方式启动变量和属性,属性通常用大写字母(如公共int Year { get; set; } )声明。
结论:我是通过返回以下代码来工作的:
public ActionResult Statistics(int ?id) {
var data = new[] {new Entry() {value = 20, year = 2008}, new Entry() {value = 10, year = 2009}};
return Json(data,JsonRequestBehavior.AllowGet);
}在Morris初始化代码中,删除数据声明中的数组括号,使之成为data : result而不是data : [result]。
解决此问题的第一步是查看统计方法返回的内容。例如,通过在Chrome中测试您的网站,然后点击F12,然后选择“网络”选项卡,您就可以很容易地做到这一点。然后Ctrl+F5页面并在结果窗格中找到对服务器的调用。单击它,然后选择Response,并继续对您的方法进行故障排除,直到它返回您所需的为止。
如果数据格式错误,并且不包含莫里斯期望的键,莫里斯会抛出一个错误,上面写着Uncaught TypeError: Cannot read property 'match' of undefined。继续努力,直到你把它弄走,希望你能看到你的图表:)
PS:最后一件事,我会将Morris init代码包装在$(document).ready()调用中
发布于 2015-07-26 03:42:34
当我从函数(手动输入)发送数据(值和日期)时,一切正常,json文件是受欢迎的上帝,我看到图表,但是当我从数据库发送数据时,没有图表,但我看到json文件也是弹出的。
这是代码:
public class YearlyStat
{
public string year { get; set; }
public double value { get; set; }
}
public ActionResult Statistics(int? id)
{
//var result = db.pricepoints.Where(r => r.commodityID.Equals(id));
var items = from item in db.pricepoints
where (item.commodityID == id)
select item;
var stats = new List<YearlyStat>();
foreach (var item in items)
{
stats.Add(new YearlyStat
{
year = item.date_of_price.ToShortDateString(),
value = item.value
});
}
//but this work's
//string s = "2.2.2002";
//double v = 20.20;
//stats.Add(new YearlyStat { year = s, value = v });
//or
//stats.Add(new YearlyStat { year = "2.2.2002", value = 20.20 });
return Json(stats, JsonRequestBehavior.AllowGet);
}在这两种情况下,类型都是字符串和双。
https://stackoverflow.com/questions/31631647
复制相似问题