Mvc.WebViewPage <T>.Model.get вернул ноль и идентификатор в представлении создания - PullRequest
0 голосов
/ 14 января 2019

Я получаю эту ошибку при попытке создать объект при использовании списков DropDown и ListBox

System.NullReferenceException System.Web.Mvc.WebViewPage.Model.get вернул ноль.

Модель

public class Game
    { 
    [Key]
    public int Id { get; set; }
    public string Title { get; set; }
    public Publisher Publishers { get; set; }
    public int PublisherID { get; set; }
    public List<Category> Categories { get; set; }
    public string ImageLink { get; set; }

    public Game()
    {
        Categories = new List<Category>();
    }
}

Просмотр модели

public class GameViewModel
{
    public int Id { get;  set; }
    public string Title { get;  set; }
    public object Category { get;  set; }
    public Publisher Publisher { get;  set; }
    public string ImageLink { get;  set; }

    public GameViewModel(int id, string title, List<Category> category, Publisher publisher, string imageLink)
    {
        this.ID = id;
        this.Title = title;
        this.Category = category;
        this.Publisher = publisher;
        this.ImageLink = imageLink;
    }

Создать модель представления

 public class CreateGameViewModel{

    public Game Game { get; private set; }
    public List<SelectListItem> Categories { get; private set; }
    public List<SelectListItem> Publishers { get; private set; }
    public int[] SelectedCategory { get; set; }
    public CreateGameViewModel()
    {
    this.Game = new Game();
    }

    public CreateGameViewModel(List<Models.Category> categories, List<Models.Publisher> publishers)
    {
        Categories = categories.Select(c => new SelectListItem() { Text = c.Name, Value = c.Id.ToString() }).ToList();

        Publishers = publishers.Select(p => new SelectListItem() { Text = p.Name, Value = p.Id.ToString() }).ToList();
    }
}

Мой контроллер

 GET
 public ActionResult Create()
    {
        var publishers = _db.Publishers.ToList();
        var categories = _db.Categories.ToList();
        var gameVM = new CreateGameViewModel(categories: categories, publishers: publishers);
        return View(gameVM);
    }
 POST 
    [HttpPost]
    public ActionResult Create(CreateGameViewModel game)
    {
        try
        {
            var categories = _db.Categories.Where(c => game.SelectedCategory.Contains(c.Id)).ToList();
            game.Game.Categories = categories;
            _db.Games.Add(game.Game);
            _db.SaveChanges();

            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

Мой взгляд (где появляется ошибка)

@Html.DropDownListFor(m => m.Game.PublisherID, Model.Publishers)
@Html.ListBoxFor(m => m.SelectedCategory, Model.Categories)

У меня также есть редактор для id и PublisherID в этом представлении создания, что, конечно, не правильно, но я не уверен, где точно определить эту проблему, пока существует другая.

Может ли кто-нибудь взглянуть на этот код?

1 Ответ

0 голосов
/ 14 января 2019

Так что я думаю, что ваша проблема в Game не определена, поэтому, когда вы пытаетесь сделать @Html.DropDownListFor(m => m.Game.PublisherID, Model.Publishers), игра становится нулевой, что выдает ошибку

Ваш код:

public class CreateGameViewModel
{
    public Game Game { get; private set; }
    public List<SelectListItem> Categories { get; private set; }
    public List<SelectListItem> Publishers { get; private set; }
    public int[] SelectedCategory { get; set; }

    public CreateGameViewModel()
    {
       this.Game = new Game();
    }

    public CreateGameViewModel(List<Models.Category> categories, 
                               List<Models.Publisher> publishers)
    {
        Categories = categories.Select(c => new SelectListItem() { Text = c.Name, 
     Value = c.Id.ToString() }).ToList();

        Publishers = publishers.Select(p => new SelectListItem() { Text = p.Name, 
     Value = p.Id.ToString() }).ToList();
    }
}

Fix:

public class CreateGameViewModel
{
    public Game Game { get; private set; }
    public List<SelectListItem> Categories { get; private set; }
    public List<SelectListItem> Publishers { get; private set; }
    public int[] SelectedCategory { get; set; }

    public CreateGameViewModel()
    {
       this.Game = new Game();
    }

    public CreateGameViewModel(List<Models.Category> categories, 
                               List<Models.Publisher> publishers)
          :this()
    {
        Categories = categories.Select(c => new SelectListItem() { Text = c.Name, 
     Value = c.Id.ToString() }).ToList();

        Publishers = publishers.Select(p => new SelectListItem() { Text = p.Name, 
     Value = p.Id.ToString() }).ToList();
    }
}

Незначительное отличие заключается в : this () во втором конструкторе, это должно вызвать первый конструктор, инициализирующий Game, который должен предотвратить возникновение ошибки

Надеюсь, это поможет

...