2017-07-03 45 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的常见功能。