新的 asp.net 图表控件——它们最终会与 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 合作吗,如果会,什么时候?

30311 次浏览

你已经可以在 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 类中使用一个方法。这对我来说没问题。以这种方式工作,可以使控件呈现由图表控件 http 处理程序生成的图像的 URL。在您的部署中,您需要为它提供一个可写的文件夹来缓存映像。

* 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}");
...

我一直在测试与 MVC,到目前为止,它看起来是与 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,并将其放在 Shared view 文件夹中。

现在你将得到所有额外的 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

没有给出“ Object not set to an instance of an Object”或“ Session id was able but the response stream has been flash”(不是错误的准确措辞)的错误。

我不愿意仅仅把它们渲染成图像,因为如果你在图表上做钻取、工具提示或其他点击动作,那么渲染成图像不能保留任何东西。

我需要的关键是将图表放入模型中,将模型传递给视图(或部分视图) ,并在视图中放入 asp: 面板,然后将图表添加到视图标记中的面板中。

顺便说一下,这是在2010年9月3日 VS.net 2008和 MVC 2(日期是我在搜索答案时发现的重要内容,因为 MVC 不断发生变化)。

对于那些想要使用图表控制与 MVC3使用 Razor 引擎看到以下链接

如何使用微软图表与 MVC3与剃刀