我是 MVC 的新手,并且在状态和对象持久性方面存在概念问题,希望有人可以整理我的想法。
我有一个远程网络服务,它提供了管理订单的方法。如您所料,订单由标题和行组成。线路可以有额外的要求。
我创建了我的域对象(使用 webservice 模式中的 xsd2code),webservice 调用和对象序列化都工作正常。我已经构建了 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 等 - 而不是整个订单。
现在我的概念问题在于控制器、视图和对象持久性。
My Order 控制器有一个 Detail Action,它执行从 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 只有页面布局和对标题和行的两个部分页面的调用(我使用 Ajax 将 Headerview 交换为 HeaderEdit,LinesView 相同)
@{ Html.RenderPartial("DetailsHeaderViewPartial", Model);}
@{ Html.RenderPartial("DetailsLinesViewPartial", Model);}
目前我将模型传递到主细节容器页面,然后传递到 RenderPartials,但是我不认为模型应该传递到主细节页面,因为它不需要它 - 模型是仅在 DetailsHeaderViewPartial、DetailsLinesViewPartial 中需要,所以我最好在此处使用 @RenderAction 并将模型传递到 Header/Lines 视图中。
但是,订单是从 ActionResult Details() 中的 web 服务中检索到的,我怎样才能使检索到的 OrderViewModel 对象在控制器的 ActionResult HeaderDetails() / LineDetails() 方法中可用,以作为模型在 return PartialView(... ,模型) ?
我是否应该使用用户会话来存储 Order ViewModel,以便它可以在控制器中的操作中使用。
从这个阶段开始,用户将能够维护订单(添加/删除行 - 编辑标题等)。由于保存订单的 web 服务调用可能需要几秒钟才能完成,我宁愿只在用户完成订单后调用 save 方法。因此,我想在处理过程中将正在进行的订单保留在本地某个地方。用户会话?
非常感谢您的任何建议。一旦我了解了 ViewModel 的状态管理,我就可以停止阅读一百万篇博客文章并实际编写这个东西!