2011-06-17 105 views
5

我想知道是不是很好的做法,試圖使一個視圖,在一個通用的視圖模型?通用查看模型?

我想知道這是因爲有人提到他期望不得不做大量的重複代碼,除非他開始製作通用視圖和通用視圖模型。

所以基本上這些意見就像是一組控件。一個視圖可能有2個控件(比如文本框和單選按鈕),另一個視圖可能有50個控件。

它們都具有相同的外觀和感覺(它只是通過控件的數量而增長)。基本上他認爲有一個視圖模型接受對象(域對象)查看它並查看50個字段並呈現正確的控件類型。

我想一個編輯模板可以用來找出控制,但我只是沒有出售一般視圖模型。

我喜歡泛型,他們可以做非常強大的事情,在某些情況下他們是好的,但我只是不全面地瘋狂他們,並嘗試不使用。

我發現大部分時間可以減少重複的代碼,但有時會使代碼變得更加複雜。當然,這可能僅僅是因爲我對編程還比較陌生,它可能仍然超出我的技能水平。

我對它的下一個問題是我認爲視圖模型應該儘可能平坦,並且只公開實際將要使用的數據,以便人們不會開始使用應該從未出現在視圖中的屬性第一個地方。

我接下來的問題是,如果您有一些複雜的對象,其中有對象的對象,它可能會繼續前進。它可能會持續很長時間。

+0

[請看看我的代碼,我試圖實現類似的東西](https://stackoverflow.com/questions/48750809/generic-view-in-asp-net-core-2-0-using- lambda表達式) – Omar

回答

3

我沒有看到任何錯誤的泛型ViewModels。這是刪除重複並保留編譯時檢查的好方法,與ViewBag相反。

實施例:

假設你有一組模型類爲ProductCategory等 每個類(ProductModelCategoryModel)具有相關聯的顯示和編輯模板,其產生相應的視圖。

現在你想構建一組頁面進行查看和編輯。

我通常會創建一個佈局(母版頁的網頁形式)呈現共同的內容(頁眉,頁腳,菜單等)

然後我會創建一個接受的模型ProductViewModel個人,強類型的意見,CategoryViewModel

現在我們需要定義這些視圖模型類。每個視圖模型類應該採用ProductModel,CategoryModel等實例(將傳遞給模板)。但佈局通常需要一些額外的數據(即所選菜單,登錄用戶名等)。我的解決方案是創建一個通用的視圖模型封裝此重複數據的佈局:

public class EntityViewModel<T> 
    where T : EntityModel 
{ 
    public T Entity { get; set; } 
    public string UserName { get; set; } 
    public string SelectedMenu { get; set; } 
} 

然後你就可以很容易地創建一個ProductViewModel : EntityViewModel<ProductModel>,其中包含的一切佈局需要渲染頁面,您可以添加有任何附加,產品特定的數據。

+0

@ Jakub Konecki - 你能舉一個例子嗎?我希望至少看到一個,看看它會如何(也許它完全不同,然後我會這樣) – chobo2

+0

所以實體現在是ProductModel或CategoryModel還是它是ProductViewModel和CategoryViewModel? – chobo2

+0

@ chobo2 - 正如您在最後一句'ProductModel:EntityModel'中看到的一樣。 –

1

就ViewModel而言,我通常會將所有ViewModel從BaseViewModel繼承,這些BaseViewModel公開了有助於實現MVVM的方法。如果您想查看示例,請在下面評論。

+0

?嗯,我也會對看到這個例子感興趣。 –

+0

很想看到一個例子。我對這種模式並不熟悉。 – chobo2

+0

乍一看,我沒有看到asp.net標籤,我以爲你使用的是像Silverlight而不是MVC的MVVM。 MVC中有「視圖模型」嗎?我通常只是將視圖和模型看作單獨的實體。 – NickHeidke

5

個人而言,我避免在視圖模型中使用泛型。我同意你們中的大多數對他們提出的理由,特別是這一個:

下一個問題,我與它是我 認爲視圖模型應儘可能 平越好,只公開數據 即究竟要使用這樣 人們不開始使用性質 應該從來沒有在視圖中 首位

背後視圖模型的想法是,他們需要專門綁的要求一個給定的觀點,而不是他們一般(/通用)作爲你的領域模型。我更喜歡在視圖模型中重複使用代碼,而不是在視圖和部分中重複使用一些通用的怪物。

即使在您需要generate dynamic forms and controls的情況下,您也不需要使用通用視圖模型。因此,除非你有一些特定的超特定場景(目前無法想象),否則在視圖模型中避免泛型可能是件好事。

這就是說,不要完全排除它們,如果您覺得存在一種通用視圖模型可能有用的情況,請毫不猶豫地在此處展示它,方法是解釋場景並顯示所有代碼以便我們可以討論它。

+0

我發現搜索的唯一原因是有些人說他喜歡200個物品或者其他類似的東西,並且不想製作200個獨立的視圖模型,我猜的看法。我不確定在這種情況下我會做什麼。另一個我忘記補充的是數據註釋驗證。我猜你可能必須將其放在域對象上,我認爲這是另一個禁忌。 http://stackoverflow.com/questions/2138951/asp-net-mvc-generic-view-for-displaying-data-海報不提及查看模型,但我認爲他可能正在使用它們 – chobo2

+0

@Darin Dimitrov我是使用視圖模型僅用於將視圖中的數據傳遞給控制器​​,而不是反之。還有它的頁面編號,頁面大小,搜索過濾器等,用於閱讀,不需要添加/編輯/刪除操作。一些控制器需要額外的參數,如ProductCategoryId。我是否應該在具有額外字段的新ViewModel中使用繼承或重複代碼? – user2330678

0

我真的不喜歡在viewmodel裏面放置業務邏輯。我認爲,除了構造函數內部的常規屬性和錯誤處理,任何東西都不應該在視圖模型中。它使得代碼更簡潔,並且可以更自由地添加查看模型。 如果您需要複製很多代碼,您可以將其隔離爲獨立的viewmodel,然後將其嵌套到需要的位置。 這樣你也只有你需要的視圖。

+1

我沒有看到任何關於在ViewModel中包含邏輯的問題。 –