2011-03-25 42 views
0

我在理解如何在MVC3上使用模型時遇到了一個哲學問題。 我相信問題在於我來自WebForms的事實: - )MVC3(Models)...在視圖上顯示覆雜數據的正確方法是什麼?

比方說,我有10個表格在我的數據庫和預期的時候,當我把他們到我的EF4,我得到那些實體類代表表格(及其所有FK整數值)。

當我想要在View上顯示數據時,我無法顯示select * from表,因爲這些FK整數對我的用戶意味着什麼......並且還因爲某些數據位於相關表上。

所以我的理解是,我可以創建一個存儲過程,創建一個複雜類型,表示要顯示的實際數據,通過不同的SQL連接來自不同的表。

問題1: 在視圖上,id MVC兼容使用@model ..that複雜類型? 或我應該總是使用Models文件夾中創建的模型?如果是這樣,這是否意味着我必須在Models文件夾內的新模型上覆制複雜類型?

問題2: 這是正確的方法......創建特定的SP來收集將顯示的數據,或者.. ..最好使用linq和lambda應用於從導入數據庫導入的EF4類型EMDX設計師。

想法?? FP

回答

1

正確的方法是始終定義視圖模型。視圖模型是專門針對給定視圖的需求定製的類,並且將在MVC應用程序層中定義。這些類只包含視圖需要顯示的屬性。那麼你需要在你的領域模型(EF自動生成的類?)和視圖模型之間進行映射。

因此,控制器操作將查詢存儲庫以獲取域模型,將其映射到視圖模型並將此視圖模型傳遞給視圖。頂部方便您使用AutoMapper這個映射。視圖不應該綁定到域模型,並且始終使用視圖模型。這也適用於其他方式:控制器操作從視圖接收視圖模型作爲操作參數,將其映射到域模型並將此域模型傳遞到存儲庫以便執行一些操作(CRUD)。

因此,視圖模型可能是一個從多個域模型映射的類,或者多個視圖模型可能映射到單個域模型。這一切都取決於您的域名的外觀如何,以及您希望如何向用戶呈現信息。

就驗證而言,我區分了兩種類型:UI驗證和業務驗證。作爲UI驗證的一個例子是:需要一個字段,或者一個字段必須以給定的格式輸入。業務驗證是:用戶名已被佔用或資金不足以執行電匯。 UI驗證應該在域模型上的視圖模型和業務驗證上進行。

+0

確定它是有道理的。 – 2011-03-27 17:41:00

+0

達林,你什麼時候建議使用從存儲過程獲得結果集的複雜類型,而不是試圖在EF4實體本身上使用LINQ? 當我們有...我們是否仍然需要將SP的複雜類型結果映射到模型類? – 2011-03-27 17:49:14

0

我不確定爲什麼需要使用存儲過程,LINQ to Entities能夠生成複雜類型而無需創建存儲過程(大多數情況下)。您可以選擇數據子集,就像使用常規SQL一樣。

正如達林所說,視圖模型的使用適用於有很多複雜數據不是由單一實體表示的情況。該視圖模型將包含多個實體,甚至包含多個實體集合。這完全取決於你的數據如何被消費。

+0

也許這只是因爲我以前在WebForm的日子裏這樣做: - ) 因此,這只是一個將複雜視圖模型與適用於EF4實體的一些linq映射的問題? – 2011-03-27 17:16:59

+0

我相信你在說我是否可以做我SP的工作......在LINQ中,我不應該在LINQ中做這件事。 但是當我「需要」一個SP來做某些事情時,我的複雜類型結果集應該映射到一個模型視圖,該模型視圖可能完全是複雜類型結果的精確副本? – 2011-03-27 17:52:01

相關問題