Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP MVC 4管理控制器中的对象状态_Asp.net Mvc_Asp.net Mvc 4_Session State - Fatal编程技术网

Asp.net mvc ASP MVC 4管理控制器中的对象状态

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方法返回的,该方法包含行

我是MVC新手,对状态和对象持久性有概念上的问题,希望有人能理顺我的思路

我有一个远程Web服务,它提供了管理订单的方法。正如您所期望的那样,订单由标题和行组成。线路可能有额外的要求

我创建了域对象(使用webservice模式中的XSD2代码),webservice调用和对象序列化都可以正常工作。我已经构建了DAL/BLL层,并使用WinForms测试平台应用程序前端对其进行了测试

我使用Automapper从域对象映射视图模型对象。由于订单是从单个webservice方法返回的,该方法包含行等,因此我有一个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; }

}
目前,我正在将模型传递到主详细信息容器页面,然后传递到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);}