2

我创建了一个默认的 MVC 3 项目并为我的模型创建了默认的编辑页面。如果我不碰它,一切正常。

现在我想删除编辑页面上的一个编辑字段(因为我不希望主键可编辑)。所以我只是将 EditFor 更改为 DisplayFor。一切都正确播种,但如果我想保存,我会收到以下错误:

用户代码未处理 DbUpdateConcurrencyException

存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体后,实体可能已被修改或删除。刷新 ObjectStateManager 条目。

在我可以看到的编辑操作中,我的模型类不再获得主键(它是 0),因此更新不起作用。

// POST: /Weiterleitung/Edit/5
        [HttpPost]
        public ActionResult Edit(Rufnummern_Weiterleitungen rufnummern_weiterleitungen)
        {
            if (ModelState.IsValid)
            {
                db.Entry(rufnummern_weiterleitungen).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(rufnummern_weiterleitungen);
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }

如何在不将模型的每个字段都显示为编辑字段的情况下避免此错误?

4

2 回答 2

3

您的 POST 操作错过了 Id,因为 DisplayFor<> 不会呈现 HTML 控件,因此该值不会回传到您的控制器操作。您可以将 id 作为参数传递给您的操作(然后您需要将该参数添加到视图中的 Html.BeginForm() 调用并相应地修改您的编辑操作),或者您可以添加一个 HiddenFor<>-字段包含标识。隐藏字段在回发时传递给控制器​​,并且应该被Rufnummern_Weiterleitungen从表单值创建实例的默认绑定处理程序识别。

于 2012-06-05T07:02:05.033 回答
0

只有编辑字段(<input><select>内部<textare><form>被回发到服务器。

我建议不要直接在视图中使用您的数据库实体。在这里阅读原因:

http://blog.gauffin.org/2011/07/three-reasons-to-why-you-should-use-view-models/

于 2012-06-05T07:02:51.697 回答