2012-09-11 63 views
1

我已經閱讀了Jimmy Bogards的文章,回顧了他們如何查看模型,在我自己的項目中我遇到了幾個地方,需要一次顯示在屏幕上的大量信息,例如需要填寫所有字段一次顯示的表單。顯示查看具有大量屬性的模型

所以我們認爲模型看起來像

public class FormViewModel 
{ 
    public string field1 {get;set;} 
    public int field2 {get;set;} 
    public DateTime field3 {get;set;} 
    public string field4 {get;set;} 
    ...snip 
    public string field50 {get;set;} 
} 

現在的形式也有專門的章節,所以我們可以引入位結構進入的ViewModels這樣的:

public class FormViewModelSection1 
{ 
    public string field1 {get;set;} 
    public int field2 {get;set;} 
} 

public class FormViewModelSection2 
{ 
    public DateTime field3 {get;set;} 
    public string field4 {get;set;} 
} 

,然後主viewmodel變成

public class FormViewModel 
{ 
    public FormViewModelSection1 {get;set;} 
    public FormViewModelSection2 {get;set;} 
} 

所以我們會將更復雜的viewmodel返回給ma鑑於基本上只是代表它的每一個部分了一條通過的RenderPartial形式呈現

<div> 
My form 

<%: Html.RenderPartial("soemascx", Model.FormViewModelSection1)%> 
</div> 

或可能使用editorfor來呈現內容。

我的問題是,視圖模型的「重構」是一個有效的事情,或者它是否使得視圖模型如此平坦所提供的一些好處得以消除。

+1

我遵循這個確切的模式,除了我使用'EditorTemplates'而不是partials。 – jrummell

回答

1

我想說你的問題沒有正確的答案。這一切都取決於可用性和功能。甚至可能是個人編碼風格。 意義,只要是它是

  • 工作(顯示,回發,驗證等)
  • 服務宗旨
  • 理解他人(讀維護)

認爲它是好的解。如果你問我會做什麼:我會選擇一個裝飾良好的平面類(數據註釋)用於名稱和驗證,以及支持視覺表示的結構(如組合框列表,枚舉(或任何您感興趣的內容) )作爲單選按鈕

作爲一個說明,我對視圖模型的層次結構(繼承)有一些不好的經驗 - 驗證工作的效果很差(繼承的數據註釋不能像預期的那樣對視圖模型繼承起作用)。

所以回答您的具體問題 - 不,你沒有做錯什麼......它取決於你如何做到這一點

希望THI。 s幫助。

0

我個人不會將我的ViewModel分成子視圖模型,除非它是用於像「UserControl」類型的東西,例如,網頁側面的小表單將是一個單獨的ViewModel,主頁面ViewModel將引用它。

但一般來說,我有一個BaseViewModel,它是一個抽象類,它具有所有共享字段(如pagetitle等),然後我有一個ViewModel用於繼承BaseViewModel的View本身。例如:

public abstract class BaseViewModel 
{ 
    public string PageTitle { get; set; } 
    public string MetaDescription { get; set; } 
    public string MetaKeywords { get; set; } 
} 

我可能會在我的一些頁面中使用一個小的註冊表單。所以我會爲這個小表單創建一個單獨的ViewModel。將它分離到自己的對象中的一個好處是,當用戶提交表單時,我可以傳遞特定的SignupViewModel對象而不是主頁面及其所有實體。

public sealed class SignupViewModel 
{ 
    [Required] 
    public string YourName { get; set; } 
    [Required] 
    public string YourEmail { get; set; } 
} 

然後與上述用戶控件的基本的網頁:

public sealed class PageViewModel : BaseViewModel 
{ 
    public string PageID { get; set; } 
    public string PageContents { get; set; } 
    public SignupViewModel UserSignupForm { get; set; } 
} 

我想有許多不同的方法來解決同樣的事情,但是這上面是我如何做到這一點。