2010-09-26 49 views
0

我正在使用ASP.NET MVC。我的要求是通過像嚮導一樣的分步過程構建一個複雜的對象(由其他對象構成的對象)。逐步構建複雜的對象。在哪裏保存?

每個依賴對象都應該建立在它的步驟上並且應該在其步驟中進行驗證。例如

public class ComplexObjectModel { 
    public Object1 MyObject1 { get; set; } 
    public Object2 MyObject1 { get; set; } 
    public Object3 MyObject1 { get; set; } 
} 

至於有一個嚮導我決定創建綁定到這些模型3模型類和3個強類型的局部視圖沒有內置設備。

在僞嚮導的每一步,我都會驗證依賴模型對象,並將複雜對象的屬性設置爲其引用。

我想保存的ViewData/TempData的內部複雜的對象以下列方式

在控制器動作

[HttpPost] 
public ActionResult MyAction1() { 
    ComplexObjectModel com = (ComplexObjectModel)ViewData["ComplexObjectModel"]; 
    com.MyObject1 = new Object1(); 
    ViewData["ComplexObjectModel"] = com; 
    return PartialView("MyAction2", com.Object1); 
} 

,並在視圖

<% using (Html.BeginForm()) { %> 
    <%= Html.Hidden("ComplexObjectModel", ViewData["ComplexObjectModel"]) %> 

    ... view fields for Object1, Object n .... 
<% } %> 

但這樣做對象不會在視圖和控制器之間來回傳遞,並且從視圖返回到下一個動作時遇到過這種情況。

有沒有辦法支持這個要求?

感謝您的幫助

回答

1

有幾種方法可以解決這個問題。

首先;我可能決定將所有這些存儲在會話對象中。我在這裏假設模型非常大,所以我不希望它們存儲在視圖中,並在每次轉到下一頁時傳回。

秒;我可能會將它們存儲在數據庫中,如果嚮導沒有完成,那麼將它們作爲後臺進程的一部分刪除。

我不想做的一件事就是將複雜的對象傳遞給每個視圖。在一個寧靜的世界裏,這個觀點應該真的需要了解任何其他觀點,所以我傾向於不這樣做。

當然,這意味着您需要爲數據決定存儲位置。如果我有一個大的對象,那麼我會選擇數據庫,如果相當小,那麼我會選擇會話對象。

正如您已經發現的,讓每個視圖中的每個對象的所有數據都有問題。然而,如果你決心做到這一點,那麼查看方式就是我所要做的;

  1. 創建僅與在復 模型中的每個對象涉及 的局部視圖。
  2. 在每個視圖上,都包含部分視圖的全部三個或多個 。
  3. 對於每個不是 的部分視圖,視圖中的活動參與者 將其置於隱藏 的div內。

至少在更改屬性或添加屬性時,只需在部分視圖中設置一次而不是三次。此外,如果出現錯誤,您可以取消隱藏div並查看數據是否進入。

此外,每個字段應具有ModelName.Property的id,以便控制器知道屬性在哪裏。

<%= Html.TextBox("MyObject1.MyProperty1", value) %> 

然後在控制器中,你只需做,而這關閉袖口;

[HttpPost] 
public ActionResult MyAction1(ComplexObjectModel complexModel) { 
+0

這是不是強制要去查看的方式...我去參加會議;) – Lorenzo 2010-09-27 15:42:40

0

你可以看看MVC期貨Html.Serialize helper method它可以讓你保持狀態到控制器動作之間的隱藏字段以類似的方式經典的WebForms做的。

+0

完整_source code_樣品在** github **與***良好的模式和做法***? – Kiquenet 2016-02-23 15:23:19