新的asp.net图表控件-它们最终将与MVC一起使用吗?


Answers:


94

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

从控制器生成图像

通过生成图表并将其作为操作返回的图像(如查图曼所说,我认为):

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

12
+1-不错。2个小的更改:MemoryStream ms = new MemoryStream()应该在一个using块中,并且MVC控制器具有用于返回文件的辅助方法-而不是new FileStreamResult您可以做的return File(ms.ToArray(), "image/png", "mychart.png")
Keith 2010年

1
添加了使它在.NET 4中运行的信息-花了我很长时间才弄清楚路由问题!
西蒙·斯蒂尔

4
我刚刚在博客上发布了图表示例的.net 4.0版本的更新,并添加了两个其他项目-ChartsWithMVC和ChartsWithoutWebForms,它们基本上将图表呈现为图像并将其返回。develocity.blogspot.com/2010/04/…–
Dave Haynes

1
还有其他方法可以让我使用Microsoft图表交互和Ajax支持吗?我正在使用MVC 4
kbvishnu 2012年

可能对某人有用的附加信息:如果您的图表在一个区域内,则需要将忽略项(context.Routes.Ignore(“ {controller} / {action} /ChartImg.axd / {* pathInfo}”))添加到RegisterArea方法也是如此
Fiona-myaccessible.website


2

您已经可以将它们与MVC一起使用,只需将它们渲染为图像即可。


1

改为使用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); %>

我在使用此方法之前遇到了很多我从未见过的错误,第一个是Error executing child request for ChartImg.axd.-您可以帮忙吗?
Jimbo,2010年

用户建议<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" />在该<httpHandlers>部分下添加到web.config中,但这会导致另一个错误Session state has created a session id, but cannot save it because the response was already flushed by the application.-这是否也在您的实现中发生?
Jimbo,2010年

使用.NET 4.0或3.5?如果您使用3.5,则必须按照stackoverflow.com/questions/319835/…的建议将内容添加到web.config中。
CarlHörberg2010年

如果使用.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,版本= 4.0.0.0,文化=中性,PublicKeyToken = 31bf3856ad364e35“ /> </ handlers> <system.webServer>和<appSettings> <add key =” ChartImageHandler “ value =” storage = file; timeout = 20;“ /> </的appSettings以及RouteIgnore建议由Simon斯蒂尔
卡尔霍伯格

是的,谢谢卡尔!在MVC 4和NET 4.5 VS2012中为我工作。生成web.config元素的一种简单方法是,只需使用解决方案资源管理器将新的WebForm.aspx项添加到MVC 4项目中即可。然后将“图表控件”从“工具箱”中拖动到aspx设计图面上。并且,向App_Start / RouteConfig.cs添加代码以忽略路由,如Simon Steele所示。
subsci 2013年

1

本文最适合我:

http://www.codecapers.com/post/Build-a-Dashboard-With-Microsoft-Chart-Controls.aspx

不给出有关“对象未设置为对象的实例”或“会话ID可用但响应流已被刷新”的错误(不是错误的确切措辞)。

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

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

顺便说一句,这是在VS.net 2008和MVC 2(2010年9月3日)上进行的(由于MVC不断发生变化,我在寻找答案时发现日期很重要)。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.