2011-11-11 64 views
17

對於MVC3,我應該設計我的視圖模型,使其有一個綁定到視圖(DisplayModel),並且將其一個張貼回控制器(EditModel)?在MVC3中,我應該有單獨的「編輯」模型還是「顯示」模型?

爲了澄清,我不問數據模型與視圖模型 - 我知道把我的視圖/控制器綁定到數據/域模型並不好。

我也沒有問過在兩個單獨的視圖中共享一個模型,一個視圖用於顯示數據,另一個視圖用於編輯數據。

相反,我在詢問用於編輯數據的一個視圖,以及與視圖綁定的模型與綁定到控制器操作的模型。

換句話說,如果這是我的看法:

@model MyApp.Models.CustomerModel 

如果我的控制器動作的樣子:

public ActionResult Index(CustomerModel model) 

或者:

public ActionResult Index(CustomerEditModel model) 

在一個點上,我們做後者(單獨)。但最近,我們開始做前者(共享)。

其原因的變化是因爲:

  1. 隨着MVC3不顯眼的驗證,如果我用我的模型進行驗證DataAnnotations,這是需要在這兩種模式,如果他們是分開的(在顯示器上模型來映射客戶端驗證,以及用於服務器端驗證的編輯模型)。

  2. 隨着我們的應用程序的成熟,我們意識到我們的顯示和編輯模型是95%相同的,除了我們視圖模型中的選擇列表。我們現在已將這些移至shared class,並通過現在的視圖傳遞這些內容。

但我已經看到了指向具有共享模型視圖/控制器是一個壞主意,這it violates分離關注一些其他的討論。

有人能幫我理解這兩種方法的權衡嗎?

+1

偉大的問題,和我一直在與我自己掙扎。我在我開發的最後一個主要應用程序中都有這兩種情況。當他們流浪到很遠的地方時,我做了一個單獨的,但在大多數情況下他們是相同的。 – Patricia

回答

6

我見過非常好的爭論和反對,它只取決於最適合您的應用程序的東西。沒有一種適合所有可應用的方法!

如果您還沒有閱讀,Jimmy Bogard寫了一篇關於他的團隊如何做MVC here的非常好的文章,其中涵蓋了這個主題。

2

如果顯示和編輯視圖模型的屬性相同,我看不出有獨立類的理由。

+0

謝謝,這也是我的想法。不過,我一直聽說這違反了關注的分離 - 我沒有跟蹤我遇到的各種帖子,但能夠挖掘[這一個](http://stackoverflow.com/questions/5306655/使用視圖模型在asp-net-mvc-3/5306968#5306968),認爲這一點。 –

2

我想你會發現無論你走什麼路都會碰到或錯過,但如果你能走最簡單的可維護性路徑,那麼你應該這樣做。根據我的經驗,擁有單一模型顯然更容易維護,但似乎總會有一些業務決策迫使我分解模型。如果你在95%以上,那麼我認爲你的狀態非常好。從與您的模型相關的可維護性角度來看,您的應用程序易於維護。當變化出現時,大部分情況下您都有一個地方可以進行這種變更。我似乎總是遇到的問題是擴大跨多個模型的業務變化。複製/粘貼問題,或者乾脆忘記某處的某個屬性,總是因爲多模式問題而傷害我。

1

我們意識到我們的顯示和編輯模型與我們視圖模型中的選擇列表的 例外是95%相同。我們現在將 移到共享類中,並通過視圖傳遞給它們。

它們在數據和操作上或僅在數據上95%相同嗎?請記住,類封裝了數據和行爲。

如果它們在性能95%的相似,但有可能會在兩個班拆分沾光完全不同的操作。或者,你可能不會:)

正如有人指出,沒有一個尺寸適合,所有的答案,並在你的情況看來,一類是OK ...但如果你開始注意到,每個行爲他們是不相關的,不要害怕重新思考你的方法。

1

沒有 - 雙向視圖模型。混合它不僅難以遵循,而且可以很容易地將無效值插入頁面,然後自動綁定。例如,我可以覆蓋您的customerid(或創建一個)。

繼承基礎視圖模型,如果你必須或者完全不依賴於數據的註釋,並使用你的模型流暢API保存。

有很大的聯繫(有點無關,但自動地圖是好的)

編輯 (對不起別人以前發佈的這個下面我才意識到) http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/

而且 ASP.net MVC - One ViewModel per View or per Action?

你(恕我直言)應該通常綁定到你的方法特定的VieWModel而不是共享視圖模型。你可能會陷入缺少財產的陷阱等,但它也可能適用於你。

使用自動映射器在兩者之​​間移動。返回視圖時,Jimmy還具有很好的AutoMap屬性。回顧另一種方式,我不會使用一般的CustomerModel,因爲可能存在那些不是來自我說的創建視圖的字段。例如,客戶ID可能是必填字段,對於「創建」操作,它不會存在。但是 - 如果您發現大部分情況下都是爲您工作的,那麼根本沒有理由不使用它。

2

我同意rich.okelly's answer,有沒有正確的方法。

雖然我在使用一個模型時有幾個擔心。

這將是非常要始終使用一個模型,而無需不需要的屬性時,該視圖需要顯示的對象的可選擇列表。該模型需要有對象列表以及屬性來接受用戶選擇的POST值。這些不需要的屬性會添加少量的代碼混亂和開銷。 (解決此問題的一種方法是讓模型僅包含選定的ID並使用HTML幫助程序構建列表。)

另一個問題與安全性有關。 一種常見的情況是以應被視爲只讀的形式顯示信息。 對於ViewModel和EditModel,EditModel將只包含預期要發佈的屬性,而ViewModel將包含所有屬性。 例如,如果表單顯示用戶的工資,則用戶將能夠發佈「工資」,並通過MVC自動將其綁定到ViewModel的Salary屬性。 在這一點上,something必須完成,以確保它不會在數據庫中結束。它可能是if/else邏輯,Bind屬性,Automapper邏輯或其他東西,但重點是它是一個可以忽略的步驟。 在考慮應用程序的生命週期時,我喜歡EditModel隨着時間的推移。

這些擔憂並不意味着兩種模式都不錯,一種模式不好,但是在選擇設計時應該考慮到這些。

相關問題