3

当我尝试将控制器添加到我的 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; }
    }
}

控制器:

控制器

4

2 回答 2

2

@Benjamin - 感谢您出色而详细的回复。由于我首先使用了实体框架代码,并且我假设人们在他们的系统上安装了 SQLEXPRESS,这可能是这里的问题。

但是感谢您的详细解释。看起来它帮助了普拉莫德。

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

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

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

于 2012-01-05T17:26:02.883 回答
1

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

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

有关将代码映射到现有数据库的示例,请参见此处。

如果您还没有现有的数据库,那么您需要告诉您的实体框架代码生成一个;本文将向您展示如何做到这一点(您需要的东西在帖子的底部)。

现在,看看您设置实体类的方式并假设您尚未完成两篇文章中提到的任何事情,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);

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

于 2011-12-18T10:53:36.067 回答