【发布时间】:2015-05-19 06:33:50
【问题描述】:
假设以下领域模型。
public class SystemRequirement
{
public int SystemRequirementID { get; set; }
public Platforms Platform { get; set; }
public string CPU { get; set; }
public string RAM { get; set; }
public string Dsiplay { get; set; }
public string Discription { get; set; }
public int GameID { get; set; }
public virtual Game Game { get; set; }
}
public class Game
{
public int GameID { get; set; }
public string Name { get; set; }
public Genres Genre { get; set; }
public DateTime ReleaseDate { get; set; }
public bool Multiplay { get; set; }
public string About { get; set; }
public virtual List<SystemRequirement> SystemRequirements { get; set; }
}
public class GameSystemViewModel
{
public Game Game { get; set; }
public SystemRequirement SystemRequirement { get; set; }
}
我想制作一个表格,允许添加一个包含其系统要求的新游戏。
@model KeyStore.WebUI.Models.GameSystemViewModel
@{
ViewBag.Title = "Add";
Layout = "~/Views/Shared/_AdminLayout.cshtml";
}
<div class="container">
@using (Html.BeginForm("Add", "GameAdmin", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<div class="panel">
<div class="panel-heading">
<h3>Add New Game</h3>
</div>
<div class="panel-body">
@Html.LabelFor(m => m.Game.Name)
@Html.TextBoxFor(m => m.Game.Name)
@Html.LabelFor(m => m.Game.Genre)
@Html.TextBoxFor(m => m.Game.Genre)
@Html.LabelFor(m => m.Game.ReleaseDate)
@Html.TextBoxFor(m => m.Game.ReleaseDate)
@Html.LabelFor(m => m.Game.Multiplay)
@Html.CheckBoxFor(m => m.Game.Multiplay)
@Html.LabelFor(m => m.Game.About)
@Html.TextAreaFor(m => m.Game.About)
</div>
</div>
<div class="panel">
<div class="panel-heading">
<h3>System Requirements</h3>
</div>
<div class="panel-body">
@Html.LabelFor(m => m.SystemRequirement.Platform)
@Html.TextBoxFor(m => m.SystemRequirement.Platform)
@Html.LabelFor(m => m.SystemRequirement.CPU)
@Html.TextBoxFor(m => m.SystemRequirement.CPU)
@Html.LabelFor(m => m.SystemRequirement.RAM)
@Html.TextBoxFor(m => m.SystemRequirement.RAM)
@Html.LabelFor(m => m.SystemRequirement.Dsiplay)
@Html.TextBoxFor(m => m.SystemRequirement.Dsiplay)
@Html.LabelFor(m => m.SystemRequirement.Discription)
@Html.TextAreaFor(m => m.SystemRequirement.Discription)
</div>
</div>
<div class="panel-footer">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
}
</div>
我的控制器类有这三个动作。
- 添加:制作游戏视图
- [HttpPost]添加:获取对象并使用 linq 将它们保存在数据库中
控制器代码:
public ViewResult Add()
{
GameSystemViewModel g = new GameSystemViewModel();
g.Game = new Game();
g.SystemRequirement = new SystemRequirement();
return View(g);
}
[HttpPost]
public ActionResult Add(GameSystemViewModel g)
{
Game mygame = new Game();
mygame = g.Game;
mygame.SystemRequirements.Add(g.SystemRequirement);
gameRepository.Save(mygame);
return RedirectToAction("Add");
}
但是当表单被发布时,会发生以下错误。正如您在 Locals 中看到的,SystemRequirement 不是 NULL。
问题是什么,我该如何解决?
【问题讨论】:
-
你可能需要创建一个 ViewModel 来组合这两个模型,然后在你的 View 和 Controller 中使用它
-
@foreach (var property in ViewData.ModelMetadata.Properties)?为每个属性使用强类型帮助器,以便获得正确的 2-way 模型绑定! (无论如何,如果你做得正确,你实际上会写出更多糟糕的代码) -
感谢您的精彩回答。也许我没有提到我的主要问题是发布模型时如何使用 LINQ 保存游戏及其系统要求是我的错?为什么我得到 NullReferenceExeption ?
-
你得到一个
NullReferenceExeption,因为SystemRequirements的值是null!
标签: asp.net-mvc