Asp.net mvc ASP MVC 4管理控制器中的对象状态
我是MVC新手,对状态和对象持久性有概念上的问题,希望有人能理顺我的思路 我有一个远程Web服务,它提供了管理订单的方法。正如您所期望的那样,订单由标题和行组成。线路可能有额外的要求 我创建了域对象(使用webservice模式中的XSD2代码),webservice调用和对象序列化都可以正常工作。我已经构建了DAL/BLL层,并使用WinForms测试平台应用程序前端对其进行了测试 我使用Automapper从域对象映射视图模型对象。由于订单是从单个webservice方法返回的,该方法包含行等,因此我有一个OrderViewModel,如下所示Asp.net mvc ASP MVC 4管理控制器中的对象状态,asp.net-mvc,asp.net-mvc-4,session-state,Asp.net Mvc,Asp.net Mvc 4,Session State,我是MVC新手,对状态和对象持久性有概念上的问题,希望有人能理顺我的思路 我有一个远程Web服务,它提供了管理订单的方法。正如您所期望的那样,订单由标题和行组成。线路可能有额外的要求 我创建了域对象(使用webservice模式中的XSD2代码),webservice调用和对象序列化都可以正常工作。我已经构建了DAL/BLL层,并使用WinForms测试平台应用程序前端对其进行了测试 我使用Automapper从域对象映射视图模型对象。由于订单是从单个webservice方法返回的,该方法包含行
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; }
}
目前,我正在将模型传递到主详细信息容器页面,然后传递到RenderParties,但是我不认为应该将模型传递到主详细信息页面,因为它不需要它-该模型只在DetailsHeaderViewPartial中需要,DetailsLinesViewPartial,因此我最好在这里使用@RenderAction,并将模型传递到Header/Lines视图中
但是,订单是从ActionResult Details()中的Web服务检索的。如何使检索到的OrderViewModel对象在控制器的ActionResult HeaderDetails()/LineDetails()方法中可用,以作为返回PartialView(…,model)中的模型传递
我是否应该使用用户会话来存储Order ViewModel,以便可以跨控制器中的操作使用它
从这个阶段开始,用户将能够维护订单(添加/删除行-编辑标题等)。由于保存订单的webservice调用可能需要几秒钟才能完成,因此我宁愿在用户完成订单后才调用save方法。因此,我希望在正在进行的过程中,在本地某个地方坚持进行中的订单。用户会话
非常感谢你的建议。一旦我了解了ViewModels的状态管理,我就可以停止阅读一百万篇博客文章,真正写下这篇文章了 实际上,您这里有几个问题,因此我将尽力解决它们 1) 不使用视图模型:我会说不。视图模型表示填充视图所需的数据。看起来您正在使用视图模型作为与域模型对象相同的容器。因此,您要问的是,是否应该放弃它,只将域模型传递给视图,而您最初关心的是传递的数据比您真正需要的数据多 我不会放弃视图模型,而是在视图模型上重新访问您的属性。仅使用您需要的属性并创建映射逻辑(使用automapper或自行创建),以获取复杂域对象并填充视图模型上的属性 总结:将视图模型构建为视图所需的唯一对象,并编写映射逻辑来填充该视图模型 2) 在我细分您的具体场景之前,这只是一个最佳实践声明 您将您的体系结构描述为具有BLL和DAL。如果是这种情况,则不应持久化控制器中的任何对象。控制器不应该对数据库有任何知识,即使数据库已经存在,控制器中使用的对象也不应该知道如何保持它们自己。在控制器和web服务之间运行的对象应严格为数据传输对象(DTO)。如果您不熟悉DTO的构成,那么我强烈建议您进行一些研究,并尝试将它们构建到您的解决方案中。它将帮助您在概念上看到视图模型对象、域对象和数据传输对象之间的区别 3) 我不会尝试在会话中存储order对象。我将重新分析如何分解视图中的部分视图,以便可以以所需的方式调用ordersviewmodel作为参数的操作。这听起来像是不必要地将视图分解为部分视图 4) 您不应该关心视图模型对象的状态管理。视图(可以由许多局部视图组成)是基于视图模型提供的属性填充的。用户可以使用您开发的UI进行更改。由于您表示希望仅在完成所有更改以优化对web服务的调用后保存,因此只需在单击“提交”时重新填充视图模型的字段。现在您有了orderviewmodel的“状态”,它表示用户的更改。您可以在转换回DTO(如果您执行了我上面所说的操作)或将其映射到域对象之后,将此对象发送到web服务 1最后说明。您正在使用automapper将域映射到视图模型。我假设您的视图模型太复杂,并且包含您不需要的内容,因为您构建视图模型是为了模拟域对象,以便automapper可以通过命名约定进行映射。Automapper有一个api,用于执行标准同名属性之外的复杂(自定义)映射。不要让automapper限制您以某种方式构建视图模型
希望这有帮助谢谢回复。关于viewmodel,我并不打算完全放弃它。很抱歉,只是将它从OrderViewModel容器(包括页眉和行)中拆分为单独的viewmodels,这样我就可以将OrderHeadServiceModel传递给部分页眉,而不是传递整个订单模型。使用部分视图的原因是在单个页面中显示顺序,但通过使用Ajax切换视图,将部分视图替换为表示相同数据的编辑视图,从而允许编辑标题或行。那么加载整个订单
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);
}
@{ Html.RenderPartial("DetailsHeaderViewPartial", Model);}
@{ Html.RenderPartial("DetailsLinesViewPartial", Model);}