.Net MVC2でViewModelを使う場合の注意

2011/02/02 11:23 PM

 

フォームから入力された情報をDBに反映するためにUpdateModelを使用する場合、
updateされる側(UpdateModelの引数)も同じ方の階層である必要がある。

ビューモデルとして用意したクラス、ItemViewModelには、
ItemInfoというエンティティのプロパティがあるものとする。

Inherits="System.Web.Mvc.ViewPage
<Models.ItemInfoViewModel>"

などとして、ASPXでViewModelを使用するようにした場合、ItemInfoのプロパティItemNameにアクセスするには
model.ItemInfo.ItemName
などと書かなければならない。

こう書いた場合、レンダリングされたHTMLでは、そのフォーム要素の要素名は
name="ItemInfo.ItemName"
となる。

UpdateModelは、このようにドットによって階層を表現されたフォーム要素を、
ターゲットとなるオブジェクトの階層構造に当てはめる。
(ViewModelを使用しない場合は、単に階層がないだけだ)

[HttpPost]のEdit、つまり、更新処理を書いている時、これが分かってなくて頭を捻った。

ViewModelを使用しない場合は

var data = (from m in _context.ItemInfo
where m.ItemInfoId == id
select m).FirstOrDefault();
UpdateModel(data);
_context.SaveChanges();

のように、
・現在登録されているデータを取得
・UpdateModelでフォームの内容を反映させる
・context.SaveChangesで更新
という処理になる。

しかし、前述のようにASPXでViewModelを使用するようにしていると、
フォームコレクションのキーも階層化された名前として扱われるから、
ターゲットとなるオブジェクトも、同じ型の階層を構成しなくてはいけない。

よって、以下のような処理になる。

var data = (from m in _context.ItemInfo
where m.ItemInfoId == id
select m).FirstOrDefault();
ItemInfoViewModel viewModel = new ItemInfoViewModel();
viewModel.ItemInfo= data;
UpdateModel(viewModel);
_context.SaveChanges();

・現在登録されているデータを取得
・親階層となるViewModelを生成
・viewModelに取得したデータをセット
・UpdateModelでフォームの内容を反映させる
・context.SaveChangesで更新

以上のような処理になる。



コメントはまだありません

まだコメントはありません。

RSS feed for comments on this post. TrackBack URI

コメントを書く

WordPress Themes