既存の Breezejs の例はすべて、エンティティ モデルを との間で受け渡ししているようBreezeControllerです。
しかし、構築されたほとんどすべてのページは、何らかの形式のビュー モデルを使用しています。BreezeJ がない時代には、リポジトリからデータ (ドメイン モデル) を取得して、(AutoMapper を使用するか、手動で) ビュー モデルに入力します。ビュー モデルには、そのビューに必要なデータのみが含まれます。WebAPI はビュー モデル データのみをブラウザに送信し、そこでクライアント側のビュー モデル (通常はknockoutオブザーバブル) を設定できます。
データを保存するときは、 からデータを収集し<form>て入力ビュー モデルに入力し、そのデータのみをサーバーに送信します。サーバーでは、入力ビュー モデルのデータがドメイン モデルにマップされます。SaveChanges()更新は、リポジトリ内のDbContextエンティティを呼び出すことによって保存されます。
ではBreezeJs、EFContextProvider. 私が見た例では、通常、ドメイン モデル データを取得し、それをすべてクライアント側に渡します。
[HttpGet]
public IQueryable<Item> Items() {
return _contextProvider.Context.Items;
}
ビュー モデルを構築するのは、クライアント側の JavaScript の仕事です。
もちろん、サーバー側でビュー モデルを構築することも可能です。
[HttpGet]
public List<ItemViewModel> Items() {
var items = _contextProvider.Context.Items
.Include("RelatedEntity")
.ToList();
var model = new List<ItemViewModel>();
.... some code to build model from items ....
return model;
}
利点は、ネットワーク経由で転送されるデータが少なくなり、サーバー側で多くの操作を実行できることです。しかし、これをそのように変更することが良い習慣であるかどうかはわかりませんBreezeController。しかし、少なくとも、すべてのアイテムを一覧表示するために必要なデータを返します。
POSTデータを戻そうとしたときに、本当の問題が発生しました。
私が見つけた BreezeJs の例では、 を使用しko.observableArray()てすべてのドメイン モデル データを格納していますvm.items。次に、新しいレコードnewItemがmanager.createEntityドメイン モデルに組み込まれます。データを検証した後item.entityAspect.validateEntity()、newItemがプッシュされvm.itemsてmanager.saveChanges()呼び出さSaveChanges()れ、何らかの方法で BreezeController を呼び出します。
[HttpPost]
public SaveResult SaveChanges(JObject saveBundle) {
return _contextProvider.SaveChanges(saveBundle);
}
あまりにも多くのものが乗っ取られていることがわかりました。(同意しない場合は笑ってください。)私の質問は次のとおりです。
すぐ
createEntityにできますsaveChangesか?記入して送信する空のフォームしかありません。itemsクライアント側でアレイ全体を構築する必要はまったくありません。入力ビュー モデルを として渡し、 を
JObject呼び出す前にサーバー側の処理を行うことはできます_contextProvider.SaveChanges()か?
またまた超長文になってしまいました。最後まで読んでいただきありがとうございます。心から感謝する!