【问题标题】:Why is the model null when using default routing in ASP.NET MVC?为什么在 ASP.NET MVC 中使用默认路由时模型为空?
【发布时间】:2011-12-30 22:08:12
【问题描述】:

我有一个包含 Chart 对象的页面,我将其用作 ASP.NET MVC 中的默认路由。当我运行应用程序时,由于空引用而出现异常。如果我使用带有明确给出的控制器和操作的 URL,则一切正常。

这是显示我的意思的代码......

在注册路由中:

routes.MapRoute("Default", "{controller}/{action}", new { controller = "Dashboard", action = "Index" });

DashboardModel.cs:

public class DashboardModel
{
    public Chart MyChart { get; set; }
}

DashboardController.cs

public ActionResult Index()
{
    Chart chart = CreateChart();
    DashboardModel dm = new DashboardModel();
    dm.MyChart = chart;
    return View(dm);
}

索引.aspx

<% chartPanel.Controls.Add(Model.MyChart); %>
<asp:Panel ID="chartPanel" runat="server"></asp:Panel>

使用 URL http://localhost:2313/ 从调试器启动应用程序会导致在 Index.aspx 中上面给出的第一行出现 NullReferenceExcpetion。如果我在浏览器中输入http://localhost:2313/Dashboard/Index,图表就会正确显示。我在 Index() 操作中设置了一个断点,它创建了一个有效的模型和图表,并且在异常发生之前断点只被命中一次。

为什么模型为空?每次从我看到的内容中调用我的操作方法时,都应该创建它。我不理解的默认路由肯定有更多的事情发生。

【问题讨论】:

  • 在这两种情况下,它都会达到您的断点,对吗? CreateChart() 中是否有任何东西可以检查 URL 或路径信息?
  • chartPanel 或 chartPanel.Controls 是否有可能与模型相比为空?
  • @Smashd,是的,我的断点在这两种情况下都被命中。 CreateChart 中没有任何东西检查 URL,它只是从存储库中获取数据,然后在数据库中执行存储过程。
  • @StevenBerkovitz,可能模型不为空,但图表属性为空。这是调用堆栈:[NullReferenceException:对象引用未设置为对象的实例。] System.Web.UI.DataVisualization.Charting.ChartHttpHandler.GetHandlerUrl() +67 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作家)+420 ...

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


【解决方案1】:

看来我误认为模型为空。 Smashd 的问题让我对 URL 有了更多的思考,这就是异常的原因。虽然我不明白为什么图表需要一个 URL 才能正确显示,但我能够为这个问题添加一个解决方法。

我更改了默认路由参数如下:

new { controller = "Dashboard", action = "Default" }

然后我向我的控制器添加了一个强制重定向的新操作方法:

public ActionResult Default()
{
    return RedirectToAction("Index");
}

这使我可以使用完整的 URL 访问索引。对此可能有更好的解决方案,但至少重定向是透明的。

【讨论】:

    猜你喜欢
    • 2012-09-12
    • 2010-11-01
    • 1970-01-01
    • 2017-07-08
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多