2010-12-01 30 views
3

我在大多數的.NET MVC例子看到的圖案是有模型是控制器和下層之間傳遞的對象和直接形成綁定到那些。我選擇了一個domain-driven方法,其中我有層之間傳遞的域對象。這個想法是,這些對象將被傳遞到視圖中。MVC .NET形式與域驅動設計

我遇到的問題是,當談到與形式的網頁。我打算在返回的路上爲表單綁定單獨的對象(也包含驗證註釋)。我與域對象保持獨立,因爲單個對象可能會被不同的頁面更新,每個頁面都有它自己的驗證要求(例如,一個人的地址甚至可能不會顯示在一個頁面上,而是在另一個頁面上顯示,所以驗證不會總是在通用域對象上工作)。一旦您回傳表單並需要顯示錯誤,這會使事情變得複雜。

以一個更新頁面爲例。我將視圖鍵入到我的域Person對象中,並且頁面將從其中填充字段值。回發操作將採用該頁面的表單對象並進行驗證。如果通過,我使用automapper將值複製到表單中的域對象並保存。這一切都有效。發生故障的地方是在出現錯誤時重新顯示該頁面。如果輸入域對象,我最終只會根據舊值重新填充字段,而不是用戶輸入的值。如果它被輸入到表單對象中,那麼我需要將所有域對象翻譯爲每個頁面的這些表單對象(並且如果我需要某些值,仍然可能必須傳遞域對象,我將使用該頁的只讀)。

我敢肯定,我俯瞰/這裏過於複雜的東西。

更新由於@Charlino說過的,玩了一下後發現了一個有趣的發現。如果我使用強類型的html助手來創建輸入(Html.TextBoxFor()),它將會記住這些值,即使視圖是鍵入到域對象的。如果我使用通用的(Html.TextBox())或原始HTML,它似乎沒有。

+0

你的「表單對象」也是一個Person對象嗎?如果是這樣,請將其返回到視圖。 – Paul 2010-12-01 16:18:37

+0

@paul表單對象是person對象的一個​​子集 - 只有我期望通過HTTP Post獲得並希望驗證的字段。 – Parrots 2010-12-01 16:22:05

回答

3

具有每個視圖視圖模型對象是我最終會做。

它是多一點的前期工作,因爲我必須定義視圖模型和映射,但這些代碼是如此簡單明瞭只需幾秒鐘來寫。

通常,當我需要一個形式,我做一個獨立的Form對象,並具有視圖模型包含它。

public class MyViewModel 
{ 
    public string SomeNonFormDisplayValue { get; set; } 
    public bool AnotherDisplayOnlyValue { get; set; } 
    public IEnumerable<Tuple<int, string>> SelectionListItems { get; set; } 

    public MyViewsForm Form { get; set; } 
} 


public class MyViewsForm 
{ 
    public string EditableProperty { get; set; } 
    public int SelectionListItemId { get; set; } 
} 

我輸入我的視圖到ViewModel,但我使Post Action方法採取的形式。

public class MyController 
{ 
    [HttpGet] 
    public ActionResult Edit() { ... } 

    [HttpPost] 
    public ActionResult Edit(MyViewsForm form) { ... } 
} 

我也使查詢方法來獲取視圖模型,一個填充表單,另一種是不 - 因爲當我返回出錯的POST'd形式。