【问题标题】:ASP.NET MVC 3 add controller throws error "Object reference not set to an instance of object"ASP.NET MVC 3 添加控制器抛出错误“对象引用未设置为对象实例”
【发布时间】:2012-01-22 22:34:22
【问题描述】:

当我尝试将控制器添加到我的 ASP.NET MVC 3 Intranet 项目时出现以下错误

对象引用未设置为对象实例

我正在关注一篇文章http://sumitmaitra.wordpress.com/2011/11/13/fun-with-signalr/开发SignalR应用程序。

我怀疑在安装 SignalR 后出了什么问题,但不太确定。

编辑

型号代码:

public class BlogPost
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string Title { get; set; }
    public string Post { get; set;}
}

数据库上下文:

namespace SignalR.Models
{
    public class BlogPostContext : DbContext
    {
        public DbSet<BlogPost> BlogPosts { get; set; }
    }
}

控制器:

【问题讨论】:

  • 需要一些代码来帮助你,谢谢!
  • 你试过调试你的代码吗?
  • 在您的图片上,您在Data context class dropdown 中选择了BlogPost 而不是BlogPostContext。它是您图像中的“错字”吗?因为你必须提供一个继承自 DbContext 的类。
  • @nemesv 我的错..这是一个错误的图像。更新了正确的图片。

标签: asp.net asp.net-mvc-3 ef-code-first nuget signalr


【解决方案1】:

@Benjamin - 感谢您出色而详细的回复。由于我首先使用了 Entity Framework Code,并且我认为人们在他们的系统上安装了 SQLEXPRESS,这可能就是这里的问题。

但感谢您的详细解释。看起来它帮助了 Pramod。

@Pramodtech - 如果您能告诉我们 Benjamin 的哪一项建议对您有帮助,我很乐意更新文章以使其更清晰。

我认为人们会下载代码并立即使用它:)。

这确实属于“cmets”部分,但我还没有足够的代表发表评论,因此很抱歉将其发布为答案。

【讨论】:

    【解决方案2】:

    我对 SignalR 一无所知,但我很确定问题与您尝试为空对象的属性呈现 HTML 的视图有关。

    我浏览了这篇文章,看不到对存储数据的实际数据库的任何引用,并且没有提供任何代码来从您的代码生成数据库(帖子的作者不清楚您是否将连接到现有数据库或正在生成的数据库)。

    See here for example of mapping your code to an EXISTING database.

    如果您还没有现有的数据库,那么您需要告诉您的实体框架代码生成一个; This article will show you how to do that(你需要的东西在帖子的底部)。

    现在,看看您设置实体类的方式,并假设您还没有完成两篇文章中提到的任何事情,Entity Framework 应该会自动为您创建一个数据库(这是默认行为- 不确定如果您没有安装 SQL Server Express 或更高版本会发生什么)。您是否检查过您的 SQL Server 实例中是否有数据库?它应该被称为BlogPostContext。用一些数据填充它,现在应该可以工作了。

    那么你为什么会遇到这个问题?目前你要么有

    1. 没有数据库,或者
    2. 没有数据的数据库。

    这意味着你的控制器要么是

    1. 从不存在的东西请求数据,或者
    2. 从空数据库请求数据

    您将从这两种情况中得到的结果是一个空对象。然后将此空对象传递给您的视图,然后这些视图将尝试迭代该空对象并生成您的异常。

    您可以通过两种方式验证这一点。

    1. 检查视图中的空对象,如果空检查返回 false,则仅根据您的模型输出 HTML。
    2. 将控制器中的数据库检索逻辑替换为生成一些虚拟博客数据并将其传递到视图中的代码。

    对于解决方案 1,您认为类似于以下内容:

    @if (Model == null)
    {
        <span>No data!</span>
    }
    @else
    {
        // All the auto generated view code goes here...
    }
    

    对于解决方案二,您需要替换控制器中的数据检索代码。所以删除任何这样的代码;

    BlogPost blogPost = db.BlogPosts.Find(id)
    

    并用类似的东西替换它;

    BlogPost blog = new BlogPost()
    {
        Title = "Use Entity Framework Code-First";
        Post = "blog post body goes here..."
    };
    
    IEnumerable<BlogPost> posts = new List<BlogPost>();
    posts.Add(blog);
    

    注意:这两个解决方案是为了向您演示问题,一旦您正确设置了数据库,您应该恢复使用数据检索代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-15
      • 2013-03-21
      • 2011-10-31
      • 2020-04-13
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      相关资源
      最近更新 更多