ASP.NET MVC 3 добавить контроллер выдает ошибку «Ссылка на объект не установлена ​​на экземпляр объекта» - PullRequest
3 голосов
/ 18 декабря 2011

Я получаю ошибку ниже, когда пытаюсь добавить контроллер в мой проект интрасети ASP.NET MVC 3

Ссылка на объект не установлена ​​на экземпляр объекта

IЯ следую статье 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;}
}

DbContext:

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

Контроллер:

Controller

Ответы [ 2 ]

2 голосов
/ 05 января 2012

@ Бенджамин - Спасибо за отличный и подробный ответ. Так как я использовал Entity Framework Code First, и я предположил, что люди установили SQLEXPRESS в своей системе, это, вероятно, проблема здесь.

Но спасибо за подробное объяснение. Похоже, это помогло Прамоду.

@ Pramodtech - Если вы можете сказать нам, какое из предложений Бенджамина помогло вам, я с удовольствием обновлю статью, чтобы прояснить ее.

Я предполагал, что люди будут загружать код и увольнять его :).

Это действительно относится к разделу "комментарии", но у меня еще недостаточно представителей, чтобы комментировать, поэтому извиняюсь за публикацию его в качестве ответа.

1 голос
/ 18 декабря 2011

Я ничего не знаю о SignalR, но я почти уверен, что проблема как-то связана с вашим представлением, пытающимся отобразить HTML для свойств нулевого объекта.

Я просмотрел статью и не вижу никакой ссылки на фактическую базу данных, в которой хранятся данные, и не был предоставлен код для создания базы данных из вашего кода (а автор поста не знает, будет ли вы подключаться к нему) существующая база данных или генерирующая).

Смотрите здесь пример отображения вашего кода в СУЩЕСТВУЮЩУЮ базу данных.

Если у вас еще нет существующей базы данных, вам нужно указать свой код Entity Framework для ее создания; Эта статья покажет вам, как это сделать (материал, который вам нужен, находится внизу поста).

Теперь, глядя на то, как вы настроили свой класс сущностей и предполагая, что вы еще не сделали ничего из того, что упоминалось в двух статьях, Entity Framework должен автоматически создать для вас базу данных (что является поведением по умолчанию). - не уверен, что произойдет, если у вас не установлен SQL Server Express или выше). Вы проверили, есть ли у вас база данных в вашем экземпляре SQL-сервера? Он должен называться BlogPostContext . Заполните это некоторыми данными, и теперь все должно работать.

Так почему вы получаете эту проблему? На данный момент у вас есть

  1. Нет базы данных, ИЛИ
  2. База данных без данных.

Это означает, что ваши контроллеры либо

  1. Запрос данных от чего-то, что не существует, ИЛИ
  2. Запрос данных из пустой базы данных

Результат, который вы получите в обоих сценариях, будет нулевым объектом. Этот нулевой объект затем передается вашим представлениям, которые затем пытаются перебрать нулевой объект и сгенерировать ваше исключение.

Вы можете проверить это двумя способами.

  1. Проверьте наличие нулевого объекта в ваших представлениях и выводите HTML на основе вашей модели только в том случае, если проверка нуля возвращает значение false.
  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);

Примечание. Эти два решения предназначены для демонстрации проблемы, и вам следует вернуться к использованию кода извлечения данных после правильной настройки базы данных.

...