2010-08-06 68 views
10

假設您想開發控制器,以便您使用ViewModel來包含您渲染的視圖的數據,那麼所有數據都應包含在ViewModel中?什麼條件可以繞過ViewModel?什麼時候使用ViewData而不是ViewModels是正確的?

我問的原因是我處於某些代碼使用ViewData而有些使用ViewModel的位置。我想在團隊中分發一組關於何時正確使用ViewData以及何時使用快捷方式的指導原則。我希望來自其他開發者的意見,以便我知道我的指導方針不僅僅是我有偏見。

回答

9

爲了進一步Fabian的評論;您可以按照this article中列出的步驟明確確保從未使用過viewdata。真的沒有任何藉口不是使用模型的一切。

如果你別無選擇,只能使用ViewData(比如在一個現有的項目上);至少使用字符串常量來解析名稱以避免使用「魔術字符串」。事實上,ViewData[ViewDataKeys.MyKey] = myvalue;事實上,我用它來處理需要「基於字符串」的任何內容(會話密鑰,緩存密鑰,VaryByCustom輸出緩存密鑰等)。

+4

+1 - 我們在這裏總是使用強類型的viewmodels,但是使用viewdata來處理其他小部分的「trim」。這通常只會在部分視圖中出現,並在各種地方重複使用。 – 2010-08-06 12:17:12

+1

@jim:同意,有些場景(如共享的局部視圖),這是不可避免的;所以最好採取措施,防止在使用ViewData時需要使用腳本自拍。) – DanP 2010-08-06 12:23:39

+0

對於字符串常量vs魔術字符串,以及爲什麼在共享部分視圖中不可避免地使用ViewData? – Howiecamp 2010-08-09 05:03:24

2

我個人從來沒有使用ViewData,除了當我測試某些東西時,我很快需要能夠看到視圖上的值,所有事情都通過模型。 Strongtyping!

+0

我完全同意。神奇的絃樂至多是醜陋的,最糟糕的麻煩。也就是說,我也使用ViewData來快速測試東西,但問題在於什麼時候最終成爲永久解決方案! – DaveDev 2010-08-06 11:56:23

+0

是 - 100%同意。我寧願如果這甚至可以被棄用。 – 2010-08-07 03:29:16

+1

@ Pure.Krome:您當然可以使用我的文章中描述的方法模擬折舊。覆蓋基本控制器中的viewdata屬性並添加[Obsolete()]屬性會給你相同的結果(基本上)。 – DanP 2010-08-09 11:40:19

1

就ASP.NET MVC 2而言,ViewModel模式是首選方法。該方法充分利用編譯時靜態類型檢查。這與compiling mvc views相結合將使您的開發工作流程更快,更高效,因爲在構建/編譯時檢測到錯誤,而不是運行時。

3

您可能希望在視圖變得更復雜時考慮的一種方法是保留模型用於輸入字段,並使用ViewData支持視圖需要呈現的任何其他內容。

至少有一對夫婦的論據來支持這一點:

  1. 你有一個母版頁,需要一些數據存在(例如像頭中的StackOverflow的用戶信息)。應用站點範圍內的ActionFilter可以在每次操作後在ViewData中填充此信息。把它放在模型中需要站點中的每一個其他模型繼承自一個基礎模型(這可能起初看起來不好,但它可能會很快變得複雜)。

  2. 當您驗證發佈的表單時,如果存在驗證錯誤,您可能要重新綁定模型(使用無效字段)返回到視圖並顯示驗證消息。這很好,因爲輸入字段中的數據被回傳並綁定到模型,但是您的視圖需要重新填充的任何其他數據呢? (例如,下拉列表值,信息消息等)這些將不會被回傳,並且將它們重新填充到模型的「回傳」輸入值「周圍」可能變得混亂。使用..view數據填充ViewData的方法通常更簡單。

以我的經驗,我發現這種方法效果很好。

而在MVC3中,dynamic ViewModels意味着沒有更多的字符串索引!

相關問題