新的asp.net图表控件-他们会使用MVC(最终)吗?




asp.net-mvc charts (5)

创建一个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); %>

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 : http://weblogs.asp.net/scottgu/archive/2008/11/24/new-asp-net-charting-control-lt-asp-chart-runat-quot-server-quot-gt.aspx

这个数百万美元的问题是......他们会与MVC合作吗?如果是,何时?


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


本文对我最有效:

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

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

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

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

顺便说一句,这是2010年9月3日与VS.net 2008和MVC 2(日期是我发现寻找答案时,因为不断发生的变化,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版本。

此外,图表控件现在似乎会为当前请求路径生成网址,而不是请求路径。 对我来说,这意味着所有图表请求都会导致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,您只需将它们渲染为图像即可





charts