【问题标题】:How to create complex ViewModels in MVC ASP.NET [closed]如何在 MVC ASP.NET 中创建复杂的 ViewModel [关闭]
【发布时间】:2017-07-03 20:30:53
【问题描述】:

所以我得到了 ViewModel 的概念,特别是安全问题,您希望将控制器功能限制在 ViewModel 中的减少字段集(作为典型的 User 模型,其中 ViewModel 没有关于密码和角色)。

假设一个 ViewModel 派生自不同的模型,如何正确实现这一点(例如牢记安全性)。这是描述问题的图片

我可以想象,最好从“子视图模型”派生而不是直接从模型本身派生。是否有最佳实践方法来做到这一点?

【问题讨论】:

  • 继承不是个好主意,用对象组合代替这个会更好

标签: c# asp.net asp.net-mvc model-view-controller


【解决方案1】:

不,视图模型的全部目的是对视图所需的确切数据进行建模,仅此而已。这不是一个真正的安全问题,我的意思是,如果你要在视图模型中存储密码和其他东西,而不是在我以前从未见过的级别上做错了。 ViewModels 在 mvc 框架中的主要目的是允许您打包和解包多个模型和额外的属性,以便您的用户能够完成他们需要完成的任何有针对性的操作,而不会给他们留下他们正在从消防站喝水的印象。我想它有一些“安全”观点,因为您不需要传递完整的模型,但仅仅因为视图模型中包含某些内容并不意味着您必须主动输出该属性的 HTML。无论如何,这些操作中的大多数都应该发生在服务器端,或者在生成 HTML 的 razor 检查中发生。

如果您过度关注安全性和控制器,那么无论如何您都应该研究 3 层架构。

【讨论】:

  • 这正是我的意思,我不想在视图模型中有密码。问题是,如果我将两个模型与微妙的信息结合起来,我应该在两者之间使用视图模型吗?
  • 这样做你能得到什么?让我们简化一下。假设您有一个包含 id、用户名、密码、DOB、昵称的用户模型。您还有另一个名为 userPreference 的模型,其中包含 id、userid(参考用户模型)、喜爱的冰淇淋口味、SSN(因为它是一个示例)。您需要一个屏幕,用户可以在其中更新他们的冰淇淋口味和昵称,以便您创建一个包含用户 ID、昵称、喜爱冰淇淋口味的新视图模型。您可以访问要更新的目标字段,并且可以通过用户 ID 引用所有数据以进行更新。
  • 让我们更进一步说,只有社交以“123”开头的用户才能更新他们最喜欢的冰淇淋口味。您将 SSN 作为可空类型添加到您的视图模型。在您看来,使用剃刀语法,您编写一个 if 语句,仅当 ssn 以 123 开头时才显示冰淇淋的编辑器。这一切都发生在服务器端,当生成 html 并将其作为响应发送时,绝对没有 SSN 的踪迹页面上的任何地方,会话中,无处。用户无法获取数据,因为您没有将其设置为在任何地方传递客户端的变量或元素。
【解决方案2】:

请参阅以下内容:

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

ViewModel 大部分时间就是这样。您希望用户能够查看什么。通常,一个 ViewModel 将在一组页面中重新使用,但可能仅限于一个或两个。

我有很多次继承项目,每个页面都有一个 ViewModel。它不一定要与您的复杂模型相匹配。由于各种原因,您可能不想将大量信息传递到视图中。

我发现为每个自定义 ViewModel/ViewModel 集创建基本控制器和继承通用功能很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2011-06-30
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    相关资源
    最近更新 更多