我是MVC的新手,我有一個狀態和對象持久性的概念問題,希望有人能把我的想法整理一下。ASP MVC 4管理控制器中的對象狀態
我有一個遠程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服務的訂單的加載並將域對象映射到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);
}
但訂單/ Details.cshtml只是有頁面佈局和(使用Ajax我交換Headerview的HeaderEdit,同爲LinesView)爲頭兩個部分頁面和線路的呼叫
@{ Html.RenderPartial("DetailsHeaderViewPartial", Model);}
@{ Html.RenderPartial("DetailsLinesViewPartial", Model);}
此刻,我將模型傳遞到主要的詳細信息容器頁面,然後到RenderPartials,但我不認爲該模型應該傳遞到主要的詳細信息頁面,因爲它不需要它 - 模型只在DetailsHeaderViewPartial,DetailsLinesViewPartial中需要,所以我最好在這裏使用@RenderAction,然後將模型傳遞給Header /線條視圖。
但是,在ActionResult Details()中從Web服務中檢索訂單如何使控制器的ActionResult HeaderDetails()/ LineDetails()方法中可用的檢索到的OrderViewModel對象作爲返回的PartialView (...,模型)?
我是否應該使用用戶會話來存儲Order ViewModel,以便它可以在控制器中的各個操作中使用。
從這個階段開始,用戶將能夠維護訂單(添加/刪除行 - 編輯標題等)。由於保存訂單的web服務調用可能需要幾秒鐘的時間才能完成,因此我只想在用戶完成訂單時調用save方法。因此,我想在正在進行工作的某個地方堅持正在進行的訂單。用戶會話?
非常感謝您的任何建議。一旦我有了ViewModel的狀態管理的頭腦,我就可以停止閱讀一百萬篇博客文章,並且實際上編寫這些東西!
感謝您的回覆。關於視圖模型,我不打算完全放棄它 - 只是將它從OrderViewModel容器(包括標題和行)拆分爲獨立的視圖模型 - 因此我可以將OrderHeaderViewModel傳遞給部分標題,而不是傳遞整個訂單模型。 部分視圖的原因是爲了在單個頁面中顯示順序,但是允許通過使用Ajax切換視圖替換具有編輯視圖的部分視圖來編輯標題或行。因此,加載整個訂單,然後使用partials繪製。 – MartinS