【问题标题】:Mvc.WebViewPage<T>.Model.get returned null and Id in Create viewMvc.WebViewPage<T>.Model.get 在创建视图中返回 null 和 Id
【发布时间】:2019-01-14 23:00:08
【问题描述】:

我在尝试使用 DropDown 和 ListBox 列表创建对象时遇到此错误

System.NullReferenceException System.Web.Mvc.WebViewPage.Model.get 返回 null。

型号

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 的编辑器,这肯定是不正确的,但我不确定在哪里查明该问题,而另一个问题存在。

有人可以看看这段代码吗?

【问题讨论】:

    标签: c# asp.net-mvc-4


    【解决方案1】:

    所以我认为您的问题是 Game 未定义,所以当您尝试执行 @Html.DropDownListFor(m =&gt; m.Game.PublisherID, Model.Publishers) 时,游戏为 null 会导致您的错误

    您的代码:

    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();
        }
    }
    

    修复:

    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,这应该会阻止错误发生

    希望对你有帮助

    【讨论】:

    • 不幸的是,问题仍然存在,尽管我的破碎视图中的 id 和 publisherId 略有变化,但开始显示 0 (oi64.tinypic.com/2luwitj.jpg)。我怀疑游戏本身的模型可能是问题?
    • 是的,我相信您需要将其设置为当前模型值,否则默认为 0 之类的值
    • 我不确定我明白你的意思,图片中的视图不能正常工作,它不应该有 id 或 publisherId 作为可设置的。我刚才确实修复了数据库,因为它没有所需的连接(oi65.tinypic.com/2rny2z8.jpg),但是 CreateView 中的“id”框仍然存在,错误也是如此。
    • 因此,如果您有一个包含 id 为 1、2、3 的三个项目的列表,则需要将您选择的 id 设置为默认值。可能值得四处搜索,因为我相信您可以很容易地找到所需的答案:)。如果没有,您可以随时为这个新问题打开一个新问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多