在SaveChanges上,我得到一个NullReferenceException。
这是我视图中的DropDownList:
@ Html.DropDownList(“MaterialCategory.Id”,Model.Categorieën)
所选值插入: MaterialDetail.MaterialCategory.Id,但未插入所有其他值(例如,类别的名称和描述)。
[HttpPost]
public ActionResult Create(db.MaterialDetail materiaal_detail)
{
try
{
// TryUpdateModel<db.MaterialDetail>(materiaal_detail); ???
materiaal_detail.Id = Guid.NewGuid();
_db.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
简而言之,我收到了所选的id,但似乎无法将其保存到数据库中。 问题必须在实体中的某个地方。
MaterialDetail =&gt;好 MaterialCategory,有id,我想当我保存它时,它只会在MaterialDetail.CategoryId中插入适当的GUID。但这种情况并没有发生。
这是我的创建(查看)
<fieldset>
<legend>MaterialDetail</legend>
<div class="editor-label">
Category
</div>
<div class="editor-field">
@Html.DropDownList("MaterialCategory.Id", Model.Categorieën)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Materiaal.name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Materiaal.name)
@Html.ValidationMessageFor(model => model.Materiaal.name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Materiaal.description)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Materiaal.description)
@Html.ValidationMessageFor(model => model.Materiaal.description)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Materiaal.inStock)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Materiaal.inStock)
@Html.ValidationMessageFor(model => model.Materiaal.inStock)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
Guid插入MaterialCategory.Id中 我该如何解决这个问题?
答案 0 :(得分:1)
除了您已对其进行硬编码的下拉列表外,所有输入字段都将以Materiaal
为前缀。因此,如果希望模型绑定器能够正确分配值,则可能需要指定此前缀:
[HttpPost]
public ActionResult Create([Bind(Prefix = "Materiaal")]db.MaterialDetail materiaal_detail)
{
...
}
或使用顶级模型(包含Materiaal
的模型):
[HttpPost]
public ActionResult Create(SomeModel model)
{
db.MaterialDetail m = model.Materiaal;
...
}
另外,我觉得有必要指出在视图中使用EF模型是不好的做法。我建议您设计视图模型,这些模型是专门针对视图需求定制的类,并且仅包含此视图所需的属性。为了便于模型和视图模型之间的映射,您可以使用AutoMapper。
所以这里有两种情况:
控制器查询存储库并获取模型。控制器将此模型映射到视图模型,并将视图模型传递给视图
控制器从视图中接收视图模型(作为参数)。控制器将视图模型映射到相应的模型。控制器调用存储库方法来更新将模型传递给模型的内容。