使用虚拟路径在ASP.NET MVC站点中显示ASP.NET图表控件

时间:2010-02-17 15:21:16

标签: asp.net-mvc charts asp.net-charts

我有一个简单的项目,它结合了ASP.NET MVC和ASP.NET Charts控件。代码非常简单并且工作如果我在VS 2008中运行它时没有指定任何“虚拟路径”。我在他的博客上关注了Mike Ceranski的帖子:http://www.codecapers.com/post/Build-a-Dashboard-With-Microsoft-Chart-Controls.aspx

但是,如果我放置一个虚拟路径(在项目属性的“Web”选项卡中),它将失败并产生此错误:无法映射路径'/ChartImg.axd'。因此,它似乎仍然希望在根目录中而不是在虚拟路径内调用ChartImg.axd。

所以,我的问题是 - 如何让它转到虚拟路径呢?

我还做过控制器操作只返回图像文件流的地方 - 我不想要 - 因为最终我希望能够使图表可点击而不仅仅是普通图像。

以下是与ASP.NET Chart相关的web.config设置:

<appSettings>
    <add key="ChartImageHandler" value="storage=file;timeout=20;URL=/App_Data/MicrosoftChartControls/"/>
</appSettings>

<httpHandlers>
    ...
    <add verb="*" path="ChartImg.axd" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
</httpHandlers>

控制器代码:

public ActionResult Index() {
    ViewData["Message"] = "Welcome to ASP.NET MVC!";
    ViewData["Chart"] = BindChartData();
    return View();
}

private Chart BindChartData() {
    Chart chart = new Chart();
    chart.Width = 150;
    chart.Height = 300;
    chart.Attributes.Add("align", "left");            

    chart.Titles.Add("MY CHART");  
    chart.ChartAreas.Add(new ChartArea());

    chart.Series.Add(new Series());
    chart.Legends.Add(new Legend("MY CHART"));
    chart.Legends[0].TableStyle = LegendTableStyle.Auto;
    chart.Legends[0].Docking = Docking.Bottom;

    for (int i = 0; i < 10; i++) {
        string x = ChartTest.Models.Utility.RandomText();
        decimal y = ChartTest.Models.Utility.RandomNumber(1, 100);
        int ptIdx = chart.Series[0].Points.AddXY(x, y);
        DataPoint pt = chart.Series[0].Points[ptIdx];
        pt.LegendText = "#VALX: #VALY";
    }

    chart.Series[0].Legend = "MY CHART";
    return chart;
}

aspx的代码:

<%         
    supportChart.Controls.Add(ViewData["Chart"] as Chart);        
%>
<asp:Panel ID="supportChart" runat="server"></asp:Panel>

2 个答案:

答案 0 :(得分:1)

为了获得要忽略的路径,您必须添加IgnoreRoute的特定路径。

routes.IgnoreRoute("VirtualPath/{resource}.axd/{*pathInfo}");

我还可以使用以下方式让它在我的特定情况下工作:

routes.IgnoreRoute("{controller}/{action}/{resource}.axd/{*pathInfo}");

答案 1 :(得分:0)

我不是路由专家,但在global.asax中可能需要这样的东西:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");