2

デフォルトの MVC 3 プロジェクトを作成し、モデルのデフォルトの編集ページを作成しました。私がそれに触れなければ、すべてうまくいきます。

ここで、編集ページの編集フィールドの 1 つを削除したいと思いました (主キーを編集可能にしたくないため)。そのため、EditFor を DisplayFor に変更しました。その後、すべてが正しく播種されますが、保存したい場合は次のエラーが発生します。

DbUpdateConcurrencyException がユーザー コードによって処理されませんでした

Store update、insert、または delete ステートメントが予期しない数の行 (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

DisplayFor<> は HTML コントロールをレンダリングしないため、POST アクションは Id を見逃しており、そのため、値はコントローラー アクションにポストされません。id をパラメーターとしてアクションに渡すか (そのパラメーターをビューの Html.BeginForm() 呼び出しに追加し、それに応じて Edit アクションを変更する必要があります)、または HiddenFor<> フィールドを追加することができます。 IDが含まれています。非表示フィールドは、ポストバック時にコントローラーに渡されRufnummern_Weiterleitungen、フォーム値からインスタンスを作成する既定のバインド ハンドラーによって認識される必要があります。

于 2012-06-05T07:02:05.033 に答える
0

編集フィールド ( <input><select>および<textare><form>) のみがサーバーに戻されます。

ビューで db エンティティを直接使用しないことをお勧めします。ここで理由を読んでください:

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

于 2012-06-05T07:02:51.697 に答える