C# 对象引用未设置为使用图表控件和MVC的对象实例

C# 对象引用未设置为使用图表控件和MVC的对象实例,c#,asp.net-mvc,charts,C#,Asp.net Mvc,Charts,我正在尝试使用ASP.NET(C#)和MVC创建一个网站。我到处寻找答案,希望能得到一些帮助 想法和一些代码取自: 我能够用一个简单的MVC项目和伪造的数据完成上述工作 我试图在局部视图中显示图表,但不断出现以下错误: 对象引用未设置为对象的实例 我不知道为什么我会得到这个。调试时,列表显示其中有一个图表。我还能够打印出模型中设置的图表信息(即高度、宽度)。我只是不能在局部视图中渲染它。将图表创建为图像对我没有用处 提前感谢您的帮助 我认为它与web.config没有任何关系,但无论如何都会包括

我正在尝试使用ASP.NET(C#)和MVC创建一个网站。我到处寻找答案,希望能得到一些帮助

想法和一些代码取自:

我能够用一个简单的MVC项目和伪造的数据完成上述工作

我试图在局部视图中显示图表,但不断出现以下错误: 对象引用未设置为对象的实例

我不知道为什么我会得到这个。调试时,列表显示其中有一个图表。我还能够打印出模型中设置的图表信息(即高度、宽度)。我只是不能在局部视图中渲染它。将图表创建为图像对我没有用处

提前感谢您的帮助

我认为它与web.config没有任何关系,但无论如何都会包括它:

web.config

    <configuration>
      <appSettings>
        <add key="ChartImageHandler" value="Storage=file;Timeout=20;Url=/tempImages/;"/>
      </appSettings>
      <system.web>
      <httpHandlers>
         <add verb="GET,HEAD,POST" path="ChartImg.axd" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
      <add verb="GET,HEAD,POST" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler,     Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"   />
    </httpHandlers>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      </assemblies>
    </compilation>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880"/>
    </authentication>
    <pages>
      <namespaces>
        <add namespace="System.Web.Mvc"/>
        <add namespace="System.Web.Mvc.Ajax"/>
        <add namespace="System.Web.Mvc.Html"/>
        <add namespace="System.Web.Routing"/>
      </namespaces>
      <controls>
        <add tagPrefix="asp" namespace="System.Web.UI.DataVisualization.Charting" assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      </controls>
    </pages>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true"/>
    <handlers>
      <remove name="ChartImageHandler"/>
      <add name="ChartImageHandler" preCondition="integratedMode" verb="GET,HEAD,POST" path="ChartImg.axd" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
    </handlers>
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
型号

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.DataVisualization;
using System.Web.UI.DataVisualization.Charting;

namespace Dashboard.WebUI.Models {
    public class PieChartModel {
        public PieChartModel() {
        }

        internal class PieChartData {
            public String Title { get; set; }
            public String[] Data { get; set; }
            public double[] xValues { get; set; }
            public double[] yValues { get; set; }
        }

        private Chart BuildServerPieChart() {
            String[] temp = { "France", "Canada", "Germany", "USA", "Italy" };
            double[] x = {1.0, 2.3, 4.5, 5.5, 5.6 };
            double[] y = {1.0, 2.0, 3.0, 4.0, 5.0 };

            PieChartData data = new PieChartData {
                Title = "Test Server",
                Data = temp,
                xValues = x,
                yValues = y
            };

            return BindChartData(data);
        }

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

            chart.Titles.Add(data.Title);
            chart.ChartAreas.Add(new ChartArea());

            chart.Series.Add(new Series());

            chart.Legends.Add(new Legend("Countries"));
            chart.Legends[0].TableStyle = LegendTableStyle.Auto;

            chart.Legends[0].Docking = Docking.Bottom;

            chart.Series[0].ChartType = SeriesChartType.Pie;

            for(int i = 0; i < data.xValues.Length; i++){
                double x = data.xValues[i];
                double y = data.yValues[i];

                int ptIdx = chart.Series[0].Points.AddXY(x, y);
                var c = data.Data[i];

                DataPoint pt = chart.Series[0].Points[ptIdx];
                pt.ToolTip = c + ""+ x;
            }
            chart.Series[0].Legend = "Countries";
            return chart;
        }

        public List<Chart> PieCharts {
            get {
                List<Chart> charts = new List<Chart>();
                charts.Add(BuildServerPieChart());
                return charts;
            }
        }


    }
}
<!-- CONTENT -->
                    <div id="fps-main" style="width: 100%">
                        <div>
                            <asp:ContentPlaceHolder ID="LineSummary" runat="server">
                            </asp:ContentPlaceHolder>
                        </div>
                        <div>
                            <asp:ContentPlaceHolder ID="MiddleRow" runat="server">
                            </asp:ContentPlaceHolder>
                        </div>
                        <div>
                            <asp:ContentPlaceHolder ID="BottomRow" runat="server">
                            </asp:ContentPlaceHolder>
                        </div>
                    </div>
                    <!-- //CONTENT -->

我不确定你的问题是否和我的一样,但我也遇到过这个问题。对我来说,在绘制图表的过程中,ChartHttpHandler会调用其(私有)静态GetHandlerUrl()方法,该方法包含以下行:

string str = Path.GetDirectoryName(HttpContext.Current.Request.CurrentExecutionFilePath ?? "").Replace(@"\", "/");
不幸的是,对于我(也可能是您)来说,URL重写代码的工作方式是“HttpContext.Current.Request.CurrentExecutionFilePath”的值有时可能是“/”,而Path.GetDirectoryName()为“/”返回null

由于他们决定将.Replace()直接插入GetDirectoryName()结果,因此最终会出现一个糟糕的NullReferenceException


对我来说,解决办法就是确保网站的根页面上永远没有图表。。。是的,真的。。。(确实为我赢得了“本年度最丑的解决方案”奖)

我添加了以下内容,以检查LineSummary.ascx中for循环内的空对象。如果(chart!=null&&PieSummaryChartPanel!=null){…在这里尝试catch block},那么我不认为它是上面的重复。我猜这与部分观点有关。不过,我对MVC还不熟悉。
NullReferenceException
的原因只有一个——在使用它之前,有人没有设置它。异常发生在哪一行?发布完整的异常。这是一个困难的异常。您所做的某些操作导致您调用的代码抛出
NullReferenceException
。这就更难调试了。我只是猜测,但当它试图找到处理程序时失败了。检查您的web.config以查看是否正确配置了图表控件的处理程序。我非常怀疑您的模型创建控件。枚举模型的一部分的天真行为实际上是创建UI控件
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Dashboard.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<%@ Register Assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
Namespace="System.Web.UI.DataVisualization.Charting" TagPrefix="asp" %>
<asp:Content  ContentPlaceHolderID="TopSpotLight" runat="server">
    <% Html.RenderPartial("TopSpotlight"); %>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="LineSummary" runat="server">
     <% Html.RenderPartial("LineSummary"); %>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="BottomRow" runat="server">
    <h2>Section 3</h2>
</asp:Content>
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Dashboard.WebUI.Models.PieChartModel>" %>
<%@ Register Assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
Namespace="System.Web.UI.DataVisualization.Charting" TagPrefix="asp" %>

    <h2>Line Summary</h2>
    <%
        //Error Occurs here but I don't think this is the problem
        foreach (Chart chart in Model.PieCharts) {

            try {

                //In this section, I tried to render the control a couplie
                //different ways. Neither worked.
                PieSummaryChartPanel.Controls.Add(chart);
                //This prints out the correct height I set in model
                Response.Write(chart.Height + "<br />");
                HtmlTextWriter writer = new HtmlTextWriter(Page.Response.Output);
                chart.RenderControl(writer);

            } catch (System.NullReferenceException e) {
                Response.Write("ERROR:  " + e.Message);
            }

        }

            //Response.Write("Test " + LineSummaryChartPanel.BorderWidth.Value);
        //}
    %>

    <asp:Panel ID="PieSummaryChartPanel" runat="server"></asp:Panel>
Server Error in '/' Application.
    Object reference not set to an instance of an object.
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

    Source Error:

    Line 11:         
    Line 12: 
    Line 13:         foreach (Chart chart in Model.PieCharts) {
    Line 14:             //if (chart != null && PieSummaryChartPanel != null) {
    Line 15:                // try {


    Source File: c:\Users\Scott\Documents\Projects\Visual Studio 2010\Projects\DashboardSolution\Dashboard.WebUI\Views\Shared\LineSummary.ascx    Line: 13

    Stack Trace:

    [NullReferenceException: Object reference not set to an instance of an object.]
       System.Web.UI.DataVisualization.Charting.ChartHttpHandler.GetHandlerUrl() +96
       System.Web.UI.DataVisualization.Charting.ChartHttpHandler.GetUrl(String query, String fileKey, String currentGuid) +32
       System.Web.UI.DataVisualization.Charting.ChartHttpHandler.GetChartImageUrl(MemoryStream stream, String imageExt) +339
       System.Web.UI.DataVisualization.Charting.Chart.Render(HtmlTextWriter writer) +420
       System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
       System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100
       System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
       System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +208
       System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
       System.Web.UI.WebControls.WebControl.RenderContents(HtmlTextWriter writer) +10
       System.Web.UI.WebControls.WebControl.Render(HtmlTextWriter writer) +32
       System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
       System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100
       System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
       ASP.views_shared_linesummary_ascx.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in c:\Users\Scott\Documents\Projects\Visual Studio 2010\Projects\DashboardSolution\Dashboard.WebUI\Views\Shared\LineSummary.ascx:13
       System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +109
       System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
       System.Web.UI.Control.Render(HtmlTextWriter writer) +10
       System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
       System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100
       System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
       System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) +208
       System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +8
       System.Web.UI.Page.Render(HtmlTextWriter writer) +29
       System.Web.Mvc.ViewPage.Render(HtmlTextWriter writer) +56
       System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter) +27
       System.Web.UI.Control.RenderControl(HtmlTextWriter writer, ControlAdapter adapter) +100
       System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +25
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3060
string str = Path.GetDirectoryName(HttpContext.Current.Request.CurrentExecutionFilePath ?? "").Replace(@"\", "/");