代码之家  ›  专栏  ›  技术社区  ›  Kyle West

新的asp.net图表控件-它们最终会与MVC一起工作吗?

  •  74
  • Kyle West  · 技术社区  · 17 年前
    6 回复  |  直到 17 年前
        1
  •  93
  •   Simon Steele    16 年前

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

    通过生成图表并将其作为动作的图像返回(我认为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");
    }
    

    通过这种方式,您只需在.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支持*

    另外,图表控件现在似乎生成指向当前请求路径而不是请求路由的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}");
    ...
    
        2
  •  11
  •   Sarath    15 年前

    对于希望使用Razor引擎将图表控件与MVC 3结合使用的用户,请参见以下链接

    How to use MS Charts with MVC3 with Razor

        3
  •  2
  •   Chatu    17 年前

    您已经可以在MVC中使用它们了,您所要做的就是将它们渲染为图像

        4
  •  1
  •   Carl Hörberg    16 年前

    改为创建Usercontrol,并为其提供完整的图表对象,并让其自行呈现:

    <%@ 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);
    %>
    

    在控制器中:

    public ActionResult Chart(){
     var c = new Chart();
     //...
     return View(c);
    }
    

    <% Html.RenderPartial("Chart", Model); %>
    
        5
  •  1
  •   Darryl    15 年前

    这篇文章最适合我:

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

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

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

        6
  •  0
  •   Picflight    16 年前

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