5

我已經看到了遍及SO,博客和書籍的地方,作者告訴你在你的模型項目中添加特定於View的ViewModels作爲基礎模型對象的包裝。這個想法是當你去模型綁定到視圖時,使它變得非常簡單和有針對性。下面是一個很好的例子:Rendering and Binding Drop Down Lists using ASP.NET MVC 2 EditorFor使用ViewModels和對System.Web.Mvc的引用是否違反了MVC模式?

但是,它讓我感到有些懊惱,因爲現在在我的模型中有System.Web.Mvc的引用,否則它可能會用於多個插座(也許WCF API,Silverlight等),但現在我有具體的參考MVC dll的將需要建立我的模型項目。

我的問題是:這是否違反MVC模式,當我們開始添加IEnumerable<SelectListItem>到我們的模型類?是否有一個可行的替代層來移動這和如何,即控制器?

任何想法或意見讚賞。

+0

看看這裏的示例mvc項目http://valueinjecter.codeplex.com/,它在視圖模型中沒有任何種類的邏輯完成 – Omu 2010-07-30 08:35:30

回答

5

我個人只在我的模型,這意味着我的模型中沒有涉及到SelectLists,SelectListItems或任何MVC具體的事情在視圖動態創建的選擇列表,從一個更可重複使用的IEnumerable列表。

例的承諾 - 在視圖中創建選擇列表的,全部採用普通視圖引擎位...

<%= Html.ListBox("SelectedStuff", 
     new SelectList(Model.SomeOptions, "id", "name", Model.SelectedStuff)) %> 
+0

確實在動態創建選擇列表阻止您使用類型化視圖和他們的HtmlHelper方法對應? – mirezus 2010-07-29 16:56:15

+0

不 - 你只是在視圖中創建選擇列表...我會給我的答案添加一個例子。 – Fenton 2010-07-29 20:17:38

+0

這對我來說看起來只是醜陋的;)我總是在控制器(也是MVC特定的)中爲我的視圖模型創建IEnumerable 並獲得更清晰的視圖。 – Necros 2010-07-29 21:41:50

1

不,的ViewModels是爲了通過查看消耗並應設在你的網頁項目。但是,您的實際模型應該沒有引用MVC或您的Web項目。把你的ViewModel看作是將你的模型和你的視圖之間的差距縮小。

3

這是否違反MVC模式,當我們 開始添加 的IEnumerable我們 模型類?

不是真的,但是如果您嘗試使用域驅動設計或業務層和MVC /表示層之間的關注點分離而不是違規行爲。

  • 模型是你的實體,您 域,你的業務層對象。

  • ViewModels是你的屏幕,形式 張貼,顯示數據桶。

模型映射到ViewModels可以包含MVC依賴項。想想看,如果這樣,ViewModels直接用於MVC。模型可以用於服務,winform,WPF或任何業務系統的程序化表示。

相關問題