新的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合作,如果是的话,何时?

您可以通过两种方式使用图表控件:

从控制器生成图像

通过生成图表并将其作为一个动作的图像返回(如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> 

在构build图表时,您不能在DataPoint元素中运行代码,因此要连接数据,您需要在View类中使用一个方法。 这对我很好。 以这种方式工作使得控件呈现由图表控件http处理程序生成的图像的URL。 在部署中,您需要提供一个可写文件夹来caching图像。

* VS 2010 / .NET 4支持*

为了在.NET 4中实现这个function,你需要用适当的公钥标记来改变图表引用到4.0.0.0版本。

此外,图表控件现在似乎生成到当前请求path而不是请求path的url。 对我来说,这意味着所有的图表请求导致404错误,因为/{Controller}/ChartImg.axd和等价物被路由阻塞。 为了解决这个问题,我添加了额外的IgnoreRoute调用,覆盖了我的用法 – 更一般的解决scheme会更好:

 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的图表控制的人员,请参阅以下链接

如何使用带有Razor的MVC3的MS图表

您已经可以将它们用于MVC,您只需将它们渲染为图像即可

做一个用户控件,而不是给它完整的图表对象,让它呈现自我:

 <%@ 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,如图像地图等免费..以及caching。

在你的控制器中:

 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可用但响应stream已被刷新'(而不是错误的确切措词)的错误。

我不愿意将它们渲染为图像,因为如果您在图表上进行下钻或工具提示或其他单击操作,则作为图像渲染不会保留任何图像。

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

顺便说一句,这是VS.net 2008和MVC 2 2010年9月3日(date是我发现重要的时候寻找答案,因为不断发生的MVC的变化)。

我一直在使用MVC进行testing,到目前为止,它看起来像使用MVC。