前提・実現したいこと
ASP.NET MVC5で、DB(SQL Server2016)から取得したデータをビューに表示、ユーザーがビューで入力したデータを受け取ってDBに反映するという処理を実装しています。
実際よりt_item_listのメンバ等を簡略化していますが、以下のようなコードです。
該当のソースコード
C#
1public class t_item_list 2{ 3 public long id { get; set; } 4 public string item_name { get; set; } 5 public string information { get; set; } 6 public System.DateTime create_date { get; set; } 7} 8
C#
1public ActionResult Edit(string id) 2{ 3 t_item_list t_item_list = db.t_item_list.Find(id); 4 return View(t_item_list); 5} 6
C#
1[HttpPost] 2public ActionResult Edit([Bind(Include = "id,item_name,information")] t_item_list t_item_list) 3{ 4 if (ModelState.IsValid) 5 { 6 db.Entry(t_item_list).State = EntityState.Modified; 7 db.SaveChanges(); 8 return RedirectToAction("Index"); 9 } 10 return View(t_lend_items); 11}
(また、クラス「t_item_list」のに対応しているDB側のテーブル[dbo].[t_item_list]は、テーブル生成SQLで記述すると以下のような構造です。)
SQL
1CREATE TABLE [dbo].[t_item_list] ( 2 [id] bigint NOT NULL, 3 [item_name] NVARCHAR (30) NOT NULL, 4 [information] NVARCHAR (50) NULL, 5 [create_date] DATETIME NOT NULL, 6 PRIMARY KEY CLUSTERED ([id] ASC) 7);
###問題点
この時、create_dateはレコードの生成日時を記録するDBの内部処理用のレコード(※1)なので、Edit(POSTされた結果を受け取って更新する側)では受け取っていません。
このコードをそのまま実行すると、SaveChanges()で、create_dateがNULLだというエラーになります。
(※もし仮に実行できたとしても、crerate_dateがnullになってしまうのでやはり問題ですが)
(※1)
「create_date」は当該レコードが生成された日時を記録するフィールドです。
レコードを新規追加する際にその日時が記録され、その後は変更されません。
試したこと
以下のように、DBから更新したいレコードの値を呼び出しておき、そこにビューからPOSTされたデータを代入するというコードに変更することで、エラーは出なくなりました。
C#
1[HttpPost] 2public ActionResult Edit([Bind(Include = "id,item_name,information")] t_item_list t_item_list_temp) 3{ 4 t_lend_items t_lend_items = db.t_lend_items.Find(t_item_list_temp.id); 5 t_lend_items.item_name = t_item_list_temp.item_name; 6 t_lend_items.information = t_item_list_temp.information; 7 8 if (ModelState.IsValid) 9 { 10 db.SaveChanges(); 11 return RedirectToAction("Index"); 12 } 13 return View(t_lend_items); 14}
知りたいこと
今回行った対処が一般的な手法なのか、推奨されない手法なのかを知りたいです。より具体的には以下2点を知りたいです。
-
ビューからPOSTで受け取るデータがレコードの一部である場合、DBからレコードを取得した上でビューから受け取った分を代入するという方法は適切ですか?違うとしたら、より良い方法はありますか?
-
今回の様にレコードの一部のみを受け取る場合、POSTを受け取る側のEditメソッドでは、「t_item_list」にバインドするのではなく、必要分のみをメンバに持つ(今回ならid,item_name,informationのみを持つ)クラスを定義し、そのクラスにバインドさせる形で受け取る方が適切ですか?
回答1件
あなたの回答
tips
プレビュー