ASP.NET MVC 3: исключение NullReferenceException не было обработано пользовательским кодом

Я создал представление строгого типа из класса модели, который я создал с нуля. Я использовал List в качестве шаблона каркаса. Ошибка появляется в строке foreach с объектом model.

Просмотр:

@model IEnumerable<HockeyPoolStats.Models.Player>

@{
    ViewBag.Title = "Index";
}

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Team_Id)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Rank)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.PlayerName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.PlayerTeam)
        </td>
[...]

Контроллер:

 public class PlayerController : Controller
    {

        private HockeyPoolStatsDB _db = new HockeyPoolStatsDB();

        //
        // GET: /Player/


    public ActionResult Index()
    {
        Player _player = new Player();
        _db.Players.Add(_player);
        var model = _db.Players;

        return View(model);
    }

    }

Дбконтекст

public class HockeyPoolStatsDB : DbContext
    {

        public DbSet<Player> Players { get; set; }
        public DbSet<Team> Teams { get; set; }
        public DbSet<Goalie> Goalies { get; set; }


    }

Я не понимаю, почему model равно нулю. Это означает, что контроллер неправильно передает модель в представление?

Скриншот


person JF Beaulieu    schedule 11.08.2011    source источник
comment
привет, во-первых, использование члена DbSet‹T› для представления не очень хорошая идея, я думаю, что вы должны обернуть их модальным пользовательским интерфейсом, потому что они являются прокси-элементами. потому что контекст будет завершен, когда вы закончите создание страницы бритвы ... и вы потеряете контекст данных.   -  person Nuri YILMAZ    schedule 11.08.2011
comment
Извините, но я не понимаю.   -  person JF Beaulieu    schedule 12.08.2011
comment
Ok. пожалуйста, попробуйте изменить свой код как var model = _db.Players.ToList();   -  person Nuri YILMAZ    schedule 12.08.2011


Ответы (1)


Скорее всего, это означает, что _db.Players возвращает значение null.

Установите точку останова, выполните ее и убедитесь, что _db.Players действительно возвращает список игроков.

person Brandon    schedule 11.08.2011
comment
Я попытался добавить игрока в DbSet, и он все равно выдает ту же ошибку (см. редактирование выше). - person JF Beaulieu; 11.08.2011
comment
@JFB, можете ли вы опубликовать соответствующие части HockeyPoolStatsDB? - person Brandon; 11.08.2011
comment
Я добавил файл HockeyPoolStatsDB. - person JF Beaulieu; 11.08.2011
comment
прокси-элементы не должны передавать представление. - person Nuri YILMAZ; 11.08.2011
comment
Что такого сложного? Я просто пытаюсь передать модель в представление с помощью контроллера, и модель всегда равна нулю. Что я делаю неправильно? - person JF Beaulieu; 12.08.2011
comment
@JFB, трудно сказать. Сам код выглядит нормально, но, честно говоря, я не знаком с классом DbContext. Если вы установите точку останова на var model = _db.Players, каков результат _db.Players? Это 1 игрок или это нулевой DbSet? - person Brandon; 12.08.2011
comment
Даже с точкой останова в контроллере компилятор не останавливается и падает в представлении. (см. скриншот) и модель нулевая... Я не знаю, есть ли нулевой DbSet - person JF Beaulieu; 12.08.2011
comment
@JFB, контроллер должен быть вызван для отображения представления. Вы уверены, что отлаживаете правильно? Или что вы смотрите на правильный метод действий? - person Brandon; 13.08.2011
comment
Я почти уверен... Я установил точку останова в методе Index() контроллера. НО, я не позвонил диспетчеру. Разве контроллер не вызывается представлением с помощью @Html.ActionLink ? - person JF Beaulieu; 13.08.2011
comment
@JFB, контроллер вызывается при загрузке страницы. Маршрутизация справится со всем этим. Когда вы устанавливаете точку останова и начинаете отладку, говорит ли точка останова что-нибудь? Это сплошная красная точка, верно? - person Brandon; 13.08.2011
comment
Да, это сплошная красная точка на строке: var model = _db.Players.ToList();. Я предполагаю, что контроллер никогда не вызывается, и сначала создается представление. - person JF Beaulieu; 13.08.2011
comment
@JFB, мы ужасно отошли от темы. Возможно, будет лучше, если вы возьмете свой метод RegisterRoutes в Global.asax, коде контроллера и т. д. и зададите другой вопрос о том, почему ваш контроллер не срабатывает. Как только вы сможете начать отладку, у вас будет больше шансов решить эту проблему. - person Brandon; 13.08.2011
comment
А! Я выяснил, почему: я использовал что-то еще, кроме HomeController. Я переместил код в Index() в HomeController, и он сработал. Спасибо! - person JF Beaulieu; 13.08.2011