Scott Gu 刚刚发布了关于 .NET 团队正在分发的一组新图表控件。他们看起来不可思议:http://weblogs.asp.net/scottgu/archive/2008/11/24/new-asp-net-charting-control-lt-asp-chart-runat-quot-server-quot-gt。 aspx
百万美元的问题是……他们会与 MVC 合作吗?如果是,什么时候?
Scott Gu 刚刚发布了关于 .NET 团队正在分发的一组新图表控件。他们看起来不可思议:http://weblogs.asp.net/scottgu/archive/2008/11/24/new-asp-net-charting-control-lt-asp-chart-runat-quot-server-quot-gt。 aspx
百万美元的问题是……他们会与 MVC 合作吗?如果是,什么时候?
您可以通过两种方式使用图表控件:
从控制器生成图像
通过生成图表并将其作为动作的图像返回(我认为 Chatuman 指的是):
Chart chart = new Chart();
chart.BackColor = Color.Transparent;
chart.Width = Unit.Pixel(250);
chart.Height = Unit.Pixel(100);
Series series1 = new Series("Series1");
series1.ChartArea = "ca1";
series1.ChartType = SeriesChartType.Pie;
series1.Font = new Font("Verdana", 8.25f, FontStyle.Regular);
series1.Points.Add(new DataPoint {
AxisLabel = "Value1", YValues = new double[] { value1 } });
series1.Points.Add(new DataPoint {
AxisLabel = "Value2", YValues = new double[] { value2 } });
chart.Series.Add(series1);
ChartArea ca1 = new ChartArea("ca1");
ca1.BackColor = Color.Transparent;
chart.ChartAreas.Add(ca1);
using (var ms = new MemoryStream())
{
chart.SaveImage(ms, ChartImageFormat.Png);
ms.Seek(0, SeekOrigin.Begin);
return File(ms.ToArray(), "image/png", "mychart.png");
}
WebForms 样式
这样,您只需将图表包含在您的 .aspx 视图中(就像使用传统的 Web 表单一样)。为此,您必须在 web.config 中连接相关位
<controls>
...
<add tagPrefix="asp"
namespace="System.Web.UI.DataVisualization.Charting"
assembly="System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</controls>
<httpHandlers>
...
<add path="ChartImg.axd"
verb="GET,HEAD"
validate="false"
type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</httpHandlers>
<handlers>
...
<add name="ChartImageHandler"
preCondition="integratedMode"
verb="GET,HEAD"
path="ChartImg.axd"
type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</handlers>
构建图表时,您无法在 DataPoint 元素内运行代码,因此要连接数据,您需要 View 类中的方法。这对我来说没问题。以这种方式工作会使控件将 URL 呈现到由图表控件 http 处理程序生成的图像。在您的部署中,您需要为其提供一个可写文件夹来缓存图像。
* VS 2010 / .NET 4 支持 *
要使其在 .NET 4 中工作,您需要使用适当的公钥令牌将图表引用更改为版本 4.0.0.0。
此外,图表控件现在似乎生成了指向当前请求路径而不是请求路由的 url。对我来说,这意味着所有图表请求都会导致 404 错误,因为/{Controller}/ChartImg.axd
等价物被路线阻止了。为了解决这个问题,我添加了额外的 IgnoreRoute 调用来涵盖我的用法 - 更通用的解决方案会更好:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("ChartImg.axd/{*pathInfo}");
routes.IgnoreRoute("{controller}/ChartImg.axd/{*pathInfo}");
routes.IgnoreRoute("{controller}/{action}/ChartImg.axd/{*pathInfo}");
...
对于想要使用 Razor 引擎将图表控制与 MVC 3 一起使用的人,请参阅以下链接
您已经可以将它们与 MVC 一起使用,您所要做的就是将它们渲染为图像
改为创建一个 Usercontrol 并为其提供完整的 Chart 对象并让它自己呈现:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.Web.UI.DataVisualization.Charting.Chart>" %>
<%
Model.Page = this.Page;
var writer = new HtmlTextWriter(Page.Response.Output);
Model.RenderControl(writer);
%>
将其命名为 Chart.ascx 并将其放在您的共享视图文件夹中。
现在您将免费获得所有额外的 html,如图像地图等。以及缓存。
在您的控制器中:
public ActionResult Chart(){
var c = new Chart();
//...
return View(c);
}
在你看来:
<% Html.RenderPartial("Chart", Model); %>
这篇文章最适合我:
http://www.codecapers.com/post/Build-a-Dashboard-With-Microsoft-Chart-Controls.aspx
不会给出有关“对象未设置为对象的实例”或“会话 ID 可用但响应流已被刷新”的错误(不是错误的确切措辞)。
我不愿意只将它们呈现为图像,因为如果您在图表上进行向下钻取或工具提示或其他单击操作,则呈现为图像不会保留任何内容。
我需要的关键是将图表放入模型中,将模型传递给视图(或部分视图)并在视图中放置一个 asp:panel 并将图表添加到视图中的面板标记。
顺便说一句,这是 2010 年 9 月 3 日的 VS.net 2008 和 MVC 2(由于 MVC 不断发生变化,我在寻找答案时发现日期很重要)。
我一直在使用 MVC 进行测试,到目前为止,它看起来像是在使用 MVC。