2012-09-13 45 views
2

我讀過不少Q &由於MVC架構中的視圖中的邏輯相關,並且在大多數情況下,我同意業務邏輯不應該處於視圖中。儘管如此,我一直質疑我的方法,因爲可輕鬆訪問單個實體可以給我的外鍵關係,從而最終導致我在內部執行Linq to Entities查詢時使用Microsoft的MVC框架與實體框架結合使用視圖。MVC,強類型視圖和實體框架困境

例如:

如果我有以下兩個實體:

產品([PK]產品編號,名稱,金額)

圖像([PK]圖像標識,[FK]的ProductId, ImageTitle,DisplayOrder)

假設我有一個強類型產品的看法,我想顯示主圖像(最低的顯示順序),那麼我會做這樣的事情的觀點:

@{ 
    Image image = (from l in Model.Image 
        orderby l.DisplayOrder 
        select l).FirstOrDefault(); 
} 

這是一個用於演示目的的簡單示例,但肯定會開始彎曲與MVC體系結構有關的規則,但另一方面在Controller中執行此操作,然後(禁止天堂)將其阻塞到ViewBag或ViewData肯定會成爲一種犯罪行爲,並且爲管理超過幾個不同的相關類別而痛苦不堪。

我曾經爲複雜的模型創建自定義類,但它很費時,也很難看,因爲實體框架使得將視圖定義爲主模型變得快速和容易(在這種情況下一個產品),然後使用Linq查詢輕鬆檢索產品的所有外圍組件。

我很想知道其他人如何處理這種情況。

編輯:

我也經常做這樣的事情:

@foreach(Image i in Model.Image.OrderBy(e => e.DisplayOrder).ToList()) 
{ 
    <img ... /> 
} 
+0

你有沒有遇到模型綁定的一些問題?當你在做GET,然後用可能的用戶編輯POST回你的東西時,你需要綁定所有的字段,否則當你將它保存到數據庫時可能會丟失一些數據。還更新了我的答案。 – Bartosz

+0

@Bartosz - 不,我非常非常偶爾地(在5個大型項目中兩次)必須使用綁定排除,但大多數情況下,我可以使用顯示和編輯器模板以及諸如@ Html.EditorFor(model => model .Image.OrderBy(e => e.DisplayOrder)),並且它在發佈到控制器上時非常出色 – Rob

+0

驗證如何?有了Viewmodels,你可以使用MVC驗證註釋,使用EF類,你會用非EF的東西來污染它們。 – Bartosz

回答

0

我要去的方式「的模式自定義類」,我同意這是耗費時間和世俗的,因此工具,如已經創建了http://automapper.codeplex.com/,陪伴你完成這項任務。總的來說,我和你們的感情差不多。讀一些東西說,讓你的域模型與你的存儲無關是好的,然後是視圖模型的不同類,而不是域模型,然後看到這些庫實際上似乎在'促進'簡單的方式(對你的域類的數據註釋看起來像比EF流暢界面簡單等)。

至少我們有我猜的選擇!

模型綁定還有一個問題是,當您想要將模型數據回存並將其存儲在數據庫中時,您需要小心並確保MVC模型綁定器能夠正確綁定所有字段。否則你可能會丟失一些數據。利用視圖的自定義模型,它可能更簡單。

驗證 MVC爲您提供了一種方法使用屬性來驗證,當您使用的ViewModels,你可以自由地與這樣的標註污染它,因爲它是視圖特定的(和驗證應視圖/控制器的具體行動爲好)。當你使用EF類時,你會用無關的(也可能是衝突的)邏輯來污染這些類。

+0

這樣的東西來定義視圖中存在哪些字段。我討厭使用第三方產品執行映射和自定義類構建時的想法它已經在我的指尖實體框架,但感謝您的反饋:-) - 我同意你的第二點,正如我在我的帖子中所說,我不認爲大部分業務邏輯應觸及視圖,但我覺得當你使用EF時應該在視圖中存在一個準顯示邏輯 – Rob