引用值的DropDownList - on Post:Create - NullReferenceException

时间:2011-02-21 00:07:12

标签: asp.net-mvc exception asp.net-mvc-3

在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中 我该如何解决这个问题?

1 个答案:

答案 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

所以这里有两种情况:

  1. 控制器查询存储库并获取模型。控制器将此模型映射到视图模型,并将视图模型传递给视图

  2. 控制器从视图中接收视图模型(作为参数)。控制器将视图模型映射到相应的模型。控制器调用存储库方法来更新将模型传递给模型的内容。