2017-07-03 127 views
1

因此,我得到了ViewModel的概念,特別是安全問題,您希望將控制器功能限制在ViewModel中的縮減字段集合中(如典型的User模型,其中ViewModel沒有關於密碼和角色的信息)。假設一個ViewModel派生自不同的模型,如何正確實現這一點(例如記住安全思想)。這裏描繪的問題如何在MVC中創建複雜的ViewModels ASP.NET

enter image description here

我能想象,這是更好地從「子的ViewModels」,而不是直接從模型本身獲得的圖像。有沒有一個最佳實踐方式來做到這一點?

+2

繼承是不好的主意,它會更好地使用對象組合而不是這個 – kogoia

回答

1

沒有人,視圖模型的全部目的就是爲視圖所需的確切數據建模,沒有什麼比這更簡單了。這不是一個真正的安全問題,我的意思是,如果你要在視圖模型中存儲密碼和東西等東西,而不是在我以前從未見過的水平上做錯的事情。 ViewModels在mvc框架中的主要用途是允許您打包和解壓縮多個模型和額外屬性,以便您的用戶能夠完成他們需要完成的任何有針對性的操作,而不會給他們從消防站中飲用的印象。我猜它具有一些「安全」的觀點,因爲您不需要傳遞完整的模型,但僅僅因爲視圖模型中包含的內容並不意味着您必須爲該屬性主動輸出HTML。無論如何,這些操作大部分應該發生在服務器端,或者在生成HTML的剃刀檢查中。

如果您對安全性和控制器過於關注,那麼您應該考慮三層體系結構。

+0

這正是我的意思,我不希望在視圖模型中有密碼。問題是,如果我將兩個模型與微妙的信息結合起來,我是否應該在兩者之間使用視圖模型。 – rst

+0

這樣做你可能會得到什麼?讓我們簡化這個。假設您有一個包含用戶名,用戶名,密碼,DOB,暱稱的用戶模型。你還有第二個叫做userPreference的模型,它包含了id,userid(參考用戶模型),favoriteIceCreamFlavor,SSN(因爲它是一個例子)。你需要一個用戶可以更新他們的冰激凌風味和暱稱的屏幕,以便創建一個包含用戶標識,暱稱,favoriteIceCreamFlavor的新視圖模型。您可以訪問要更新的目標字段,也可以通過用戶標識引用所有數據以進行更新。 –

+0

讓我們進一步說,只有社交名稱以'123'開頭的用戶才能更新他們最喜歡的冰淇淋風味。將SSN作爲可空類型添加到視圖模型中。在您的視圖中使用剃鬚刀語法時,只有在ssn以123開頭時,纔會編寫一條if語句來顯示冰淇淋的編輯器。這是服務器端發生的一切,當html生成並作爲響應發送時,絕對沒有SSN的痕跡在頁面的任何地方,在會話中,無處不在。用戶無法獲取數據,因爲您沒有將其設置爲任何地方通過客戶端傳遞的變量或元素。 –

0

請參閱以下內容:

ViewModels in MVC/MVVM/Seperation of layers- best practices?

一個ViewModel僅僅是大部分時間。你希望用戶能夠查看什麼?一般來說,ViewModel將被重用在一組頁面中,但可能僅限於一個或兩個。

我有很多次,每個頁面的ViewModel繼承項目。它不一定要與你的複雜模型相匹配。有許多信息因各種原因可能不希望傳入視圖。

我發現有很多用於創建基本控制器和繼承每個自定義ViewModel/ViewModels的常見功能。