新的asp.net图表控件-它们最终会与MVC兼容吗?

74
6个回答

93

您可以使用图表控件的两种方法:

从控制器生成图像

通过从操作中生成图表并将其作为图像返回(我想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 Forms 一样)。为此,您将需要在 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}");
...

12
+1 - 不错。两个小改变:MemoryStream ms = new MemoryStream() 应该在 using 块中,而MVC控制器有用于返回文件的辅助方法 - 可以使用 return File(ms.ToArray(), "image/png", "mychart.png") 代替 new FileStreamResult - Keith
1
增加了在.NET 4中使其工作的信息 - 我花了很长时间才弄清楚路由问题! - Simon Steele
4
我在博客上发布了更新的 .net 4.0 版本的图表示例,并加入了两个额外的项目—— ChartsWithMVC 和 ChartsWithoutWebForms,它们都基本上将图表呈现为图像并返回。链接:http://develocity.blogspot.com/2010/04/aspnet-chart-controls-without-web-forms.html - Dave Haynes
1
有没有其他方法,可以让我在使用MVC 4时,使用Microsoft Charts的交互和Ajax支持? - kbvishnu
可能有帮助的附加信息:如果您的图表位于某个区域内,您还需要在RegisterArea方法中添加忽略(context.Routes.Ignore("{controller}/{action}/ChartImg.axd/{*pathInfo}"))。 - Fiona - myaccessible.website

11

2
您已经可以在MVC中使用它们,您只需要将它们呈现为图像即可。

1
创建一个用户控件,将完整的图表对象传递给它,并让它自行渲染:
<%@ 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); %>

我使用这种方法时遇到了许多以前从未见过的错误,其中第一个是“执行ChartImg.axd的子请求时出错。” - 你能帮忙解决吗? - Jimbo
用户建议在<httpHandlers>部分下的web.config中添加<add path="ChartImg.axd" verb="GET,HEAD" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false" />,然而这会导致另一个错误 Session state has created a session id, but cannot save it because the response was already flushed by the application. - 在您的实施中也遇到了这个问题吗? - Jimbo
你使用.NET 4.0还是3.5?如果你使用3.5,你需要像https://dev59.com/2nRC5IYBdhLWcg3wXPwC#320891建议的那样将内容添加到web.config中。 - Carl Hörberg
如果您使用.NET 4.0,请添加以下内容:<system.webServer> <handlers> <add name="ChartImageHandler" preCondition="integratedMode" path="ChartImg.axd" verb="GET,HEAD" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </handlers> </system.webServer>以及<appSettings> <add key="ChartImageHandler" value="storage=file;timeout=20;" /> </appSettings> 还有Simon Steele建议的RouteIgnore。 - Carl Hörberg
是的,谢谢Carl!在MVC 4和NET 4.5 VS2012中对我有效。生成web.config元素的简单方法是使用解决方案资源管理器向MVC 4项目添加一个新的WebForm.aspx项;然后从工具箱拖动图表控件到aspx设计界面上。并且,在App_Start/RouteConfig.cs中,添加忽略路由的代码,如Simon Steele所示。 - subsci

1

这篇文章对我来说是最好的:

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不断发生变化)。


0

我一直在使用MVC进行测试,目前看来它与MVC兼容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接