私は MVC を初めて使用し、状態とオブジェクトの永続性に関する概念的な問題を抱えています。誰かが私の考えを整理してくれることを願っています。
注文を管理するメソッドを提供するリモート Web サービスがあります。ご想像のとおり、注文はヘッダーと明細で構成されます。明細には追加の要件がある場合があります。
ドメイン オブジェクトを (Web サービス スキーマの xsd2code を使用して) 作成しました。Web サービスの呼び出しとオブジェクトのシリアル化はすべて正常に機能しています。私は DAL/BLL レイヤーを構築しましたが、すべて動作しています - WinForms テストベッド アプリ フロントエンドを使用してテストされています。
Automapper を使用してドメイン オブジェクトからビュー モデル オブジェクトをマップしました。注文は行などを含む単一の Web サービス メソッドから返されるため、次のような OrderViewModel があります。
public class OrderViewModel
{
public OrderHeaderViewModel OrderHeader { set; get; }
public List<OrderLineViewModel> OrderLines { set; get; }
public List<OrderLineAdditionalViewModel> OrderLineAdditional { set; get; }
public List<OrderJustificationViewModel> OrderJustifications { set; get; }
}
まず、これをモデルとしてビューに渡すかのように、 OrderViewModel を省略すべきかどうか疑問に思っています。必要以上のデータを渡しています。ビューには、注文全体ではなく、OrderHeader または OrderLines などのみが必要です。
今、私の概念上の問題は、コントローラーとビュー、およびオブジェクトの永続性にあります。
私の注文コントローラーには、Web サービスからの注文の読み込みを実行し、Domain オブジェクトを OrderViewModel オブジェクトにマップする詳細アクションがあります。
public ActionResult Details(string orderNumber)
{
OrderViewModel viewModel = new OrderViewModel();
var order = WebServiceAccess.LoadOrderByOrderNumber(orderNumber,"OBOS_WS");
viewModel = AutoMapper.Mapper.Map<BusinessEntities.Order, ViewModels.OrderViewModel>(order);
return View(viewModel);
}
ただし、Order/Details.cshtml には、ページ レイアウトと、ヘッダーと行の 2 つの部分ページへの呼び出ししかありません (LinesView と同じように、Ajax を使用して Headerview を HeaderEdit に交換します)。
@{ Html.RenderPartial("DetailsHeaderViewPartial", Model);}
@{ Html.RenderPartial("DetailsLinesViewPartial", Model);}
現時点では、モデルをメインの詳細コンテナー ページに渡し、次に RenderPartials に渡していますが、モデルは必要ないため、メインの詳細ページに渡す必要はないと思います。モデルはDetailsHeaderViewPartial、DetailsLinesViewPartial でのみ必要なので、代わりにここで @RenderAction を使用し、代わりにモデルを Header/Lines ビューに渡す方がよいでしょう。
ただし、Order は ActionResult Details() で Web サービスから取得されます。取得した OrderViewModel オブジェクトをコントローラの ActionResult HeaderDetails() / LineDetails() メソッドで使用可能にして、返される PartialView(... 、モデル) ?
ユーザー セッションを使用して Order ViewModel を保存し、コントローラー内のアクション全体で使用できるようにする必要があります。
この段階から進むと、ユーザーは注文を維持できるようになります (行の追加/削除 - ヘッダーの編集など)。注文を保存するための Web サービス呼び出しが完了するまでに数秒かかる可能性があるため、ユーザーが注文を完了したときにのみ save メソッドを呼び出したいと思います。したがって、進行中の注文をローカルのどこかで処理している間は保持したいと思います。ユーザー セッション ?
アドバイスありがとうございます。ViewModel の状態管理に頭を悩ませると、何百万ものブログ投稿を読むのをやめて、実際にこのことを書くことができるようになります!