为什么有两个类:视图模型和域模型?

2024-04-01

我知道使用域模型作为视图模型可能很糟糕。如果我的域模型有一个名为 IsAdmin 的属性,并且我有一个创建控制器操作来创建用户,那么有人可以更改我的表单并使其 POST IsAdmin=true 表单值,即使我没有在视图中公开这样的文本字段。如果我使用模型绑定,那么当我提交域模型时,该人现在将成为管理员。因此,解决方案变成仅公开视图模型中所需的属性,并使用 AutoMapper 等工具将返回的视图模型对象的属性值映射到域模型对象的属性值。但我读到,类上的绑定属性可用于指示模型绑定器应该绑定哪些属性,不应该绑定哪些属性。那么,创建两个本质上代表同一事物的独立类(域模型和视图模型)并在映射它们时产生开销的真正原因是什么?这更多的是一个代码组织问题吗?如果是的话,我有什么好处?

EDIT

我遇到的视图模型与域模型分离的最重要原因之一是需要实现 MVVM 模式(基于 Martin Fowler 的 PM 模式)来管理复杂的 UI。


我发现,虽然我的领域模型可以 85% 地获得我想要的字段,但它从未覆盖我视图中我想要的值的 100%。特别是当涉及到权限以及用户是否应该有权访问视图的某些部分时。

我试图遵循的设计理念是在我的观点中尽可能少的逻辑。这意味着我的视图模型中有“CanViewThisField”或“CanEditThisField”等字段。当我第一次开始使用 MVC 时,我会让我的域模型成为我的视图模型,并且我总是遇到这样的情况:我只需要一两个以上的字段来使我的视图不那么混乱。我从此离开了查看模型/模型生成器 https://web.archive.org/web/20100722003334/http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx路线,它对我来说非常有效。我不再与我的代码作斗争,而是能够根据需要增强我的视图模型,而不会影响域模型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么有两个类:视图模型和域模型? 的相关文章

  • 使用 MVC 3 中的 Razor View 引擎从部分视图渲染部分

    我在底部主布局中渲染了一个部分 这通常是在页面渲染时在页面底部渲染 javascript 的部分 在 View 和 partial 视图中定义该部分 页面呈现时 它会从页面视图呈现部分 但不会从 partial 视图呈现部分 如何将 par
  • 如何让CQRS适应项目? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我发现了一个新术语 名叫CQRS 命令查询职责分离 http martinfowler com bliki CQRS html其中指出 概念模型
  • 如何强制控制器/操作使用 JsonValueProvider

    再会 我正在使用 ASP NET MVC 3 其中JsonValueProvider http haacked com archive 2010 04 15 sending json to an asp net mvc action met
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • Apress Pro Asp.net MVC Framework 3 - SportsStore 编辑产品无法正常工作?

    大家好 有人购买了 Apress Pro Asp net MVC Framework 3 的 ALPHA 并创建了 SportsStore 吗 我无法终生编辑产品并成功更新数据库吗 没有显示错误 单元测试全部功能 但没有成功的 编辑 即我更
  • MVC 3 EF 4.1 dbContext - 删除具有不可空外键关系的一对多数据对象

    我正在使用 MVC 3 EF 4 1 和 dbContext 我需要知道如何删除具有不可空外键的一对多关系的实体 当我删除子实体并执行 SaveChanges 时 出现错误 操作失败 无法更改关系 因为一个或多个外键属性不可为空 当关系发生
  • MVC 3 Razor _ViewStart 中的公共变量

    我正在 MVC 3 附带的新 Razor 引擎上构建一个网站 并且喜欢新语法 但是 我对使用公共属性 常量感到不知所措 我知道使用 WebForms 我们可以在代码后面添加公共属性 public string ImageFolder get
  • IE提示打开或保存服务器的json结果

    兼容模式下的Internet Explorer通过ajax回调方法从服务器获取数据 如果我想保存数据或打开数据 会弹出一个对话框 如何摆脱它 客户说 ajax type POST data UIdlgHolder gt form seria
  • 以编程方式设置 aspnet:MaxHttpCollectionKeys

    在特定网站的一些管理功能中 我正在做一篇特别可怕的帖子 需要一个large要发布的数据量 为了实现这一点 我必须添加 Web config appSetting https stackoverflow com questions 88324
  • ASP.NET MVC区域命名空间问题

    我在我的 asp net mvc 3 解决方案中创建一个名为的新区域admin Visual Studio 自动分配名称空间 MyApp areas admin controllers 我将其更改为MyApp admin controlle
  • 你调用的对象是空的。 IE问题

    我在 ASP Net 中开发了一个网站 它在除 IE 之外的所有浏览器中都能正常工作 在 IE 中我收到错误 对象引用未设置为对象的实例 在我的本地计算机中一切正常 发布到服务器后出现错误 有什么想法如何解决这个问题吗 这是我得到的堆栈跟踪
  • ASP.NET MVC3 绑定到子类

    我有一个类型的超类Question它有多个子类 例如选择题 and 文本问题 每个子类都有自己的编辑器模板 例如 共享 EditorTemplates MultipleChoiceQuestion cshtml 我想做的是创建一个列表Que
  • Laravel Eloquent ORM 返回 stdClass 而不是实际模型

    我正在做 mymodel MyModel where url domain gt first 这返回了一个 MyModel 对象 现在 不知何故 它返回了一个 stdClass 发生了什么 laravel 有更新吗 我改变了什么吗 Than
  • 从资源文件获取 DisplayName [重复]

    这个问题在这里已经有答案了 我在 App GlobalResources 文件夹中有特定于文化的资源文件 现在我需要从此资源文件中读取 DisplayName 属性的值 我在用 Display Name MerchantName Resou
  • 如何将 django ModelForm 字段显示为不可编辑

    接受我的初步教训django ModelForm 我想让用户能够编辑博客中的条目 BlogEntry has a date postedTime title and content 我想向用户展示一个编辑表单 其中显示所有这些字段 但仅包含
  • 随机“缺少类型映射配置或不支持的映射。”自动映射器中的错误

    请参见这个帖子 https stackoverflow com questions 16303452 automapper random errors 16772435 16772435的解决方案 好吧 我终于想通了 这 AppDomain
  • MVC 3 全局过滤器排除

    我有一个过滤器 希望应用于除一个控制器之外的所有控制器 所以我试图写一些看起来像这样的东西 public static void RegisterGlobalFilters GlobalFilterCollection filters fi
  • 持久身份验证令牌过期

    我有一个使用表单身份验证的 ASP NET MVC 应用程序 这是我创建身份验证令牌的代码行 FormsAuthentication SetAuthCookie username true 我的 web config 包含
  • anaconda 和 Spyder 中的包加载错误

    我在 Anaconda 4 3 1 的 Spyder 3 1 4 中编辑了三个 python 2 7 文件 1 TestClass py Just define a class import numpy as np class TestCl
  • 你把你的验证放在 asp.net mvc 3 的哪里?

    ASP NET MVC 中一种常见的推荐做法是您不应该将您的商业模式发送到您的视图中 http lostechies com jimmybogard 2009 06 30 how we do mvc view models 相反 您应该创建

随机推荐

  • 如何让greasemonkey在新标签中一一打开大量链接?

    有一些链接与上面类似 gt td a href http Lucifase com pages 2000 php refid 2000 target blank gt 2000 a br td td a href http Lucifase
  • 我可以使用 cordova plugin add 命令安装以前版本的插件吗?

    我正在尝试从头开始重建科尔多瓦项目并一路创建文档 我希望能够安装一致版本的插件 以避免暂时重新测试新代码 有没有一种方法可以指定插件的先前版本 类似于指定 cordova 的先前版本 例如 我熟悉以下语法来安装特定版本的cordova np
  • 将字符串解析为小数、逗号和句点

    如何将字符串解析为十进制 以便它适用于两种格式 带逗号和句点 Fact public void foo var a 1 1 var b 1 1 Assert Equal Parse a Parse b private decimal Par
  • 使用 rpm-maven-plugin 的多模块 Web 应用程序示例?

    有谁知道使用 Maven 构建 RPM 的 Web 应用程序吗 这RPM Maven 插件 http mojo codehaus org rpm maven plugin 提供构建 RPM 的功能 但缺乏文档 具体来说 我正在寻找一个包含多
  • 如何重新分配 R 星对象中的单元格/像素值

    我是 R 中的 star 包的新手 并且正在尝试弄清楚如何为二维 star 对象 栅格包中的栅格 中的单元格分配新值 使用光栅我可以执行以下操作 gt library raster gt library stars gt tif syste
  • 在 ThreeJS 中将 2D 鼠标坐标转换为世界 XZ 坐标

    我需要将鼠标屏幕坐标转换为 XZ 平面上的 ThreeJS 世界坐标 我发现这个工作代码可以将鼠标位置转换为 XY 世界坐标 但我不知道如何修改它以获取 XZ 坐标 var vector new THREE Vector3 vector s
  • 使用 MemoryCache 的多个实例

    我想使用以下方法向我的应用程序添加缓存功能System Runtime Caching命名空间 并且可能希望在多个位置和不同的上下文中使用缓存 为此 我想使用多个 MemoryCache 实例 然而 我看到here http msdn mi
  • 当我运行测试用例时,实体管理器已成功注入,但在运行 Web 应用程序时抛出 NullPointerException

    我有一个奇怪的问题 我正在使用 applicatioContext bean 使用 PersistenceContext 注入实体管理器 但问题是 当我运行测试用例时 实体管理器已成功注入 但在运行 Web 应用程序时会抛出 NullPoi
  • 有没有办法让 Roo 接受 StringIO 对象来代替文件?

    我正在尝试编写一些单元测试 其中涉及Roo http roo rubyforge org 读取 Excel 2007 文件 我的单元测试文件中有一个十六进制字符串的 Excel 文件 该文件又被输入到 StringIO 实例中 我不能简单地
  • React/Jest/Enzyme - 等待时间不够长

    我有一个等待多个承诺的函数 const function async gt await function1 await function2 await function3 我想测试 function3 被调用 it calls functi
  • 如何处理返回布尔值的 GraphQL 查询?

    需要在用户注册过程中检查电子邮件是否可用或已被占用 目标是使用 GraphQL API 服务器快速查询 并让它告诉我们电子邮件是否可用或已被占用 使用 GraphQL 处理简单布尔类型情况的一般最佳实践是什么 以下是我的想法 但我不确定这是
  • Linux 上跨共享库的单例的多个实例

    正如标题所提到的 我的问题很明显 我详细描述了该场景 在singleton h文件中有一个名为singleton的类 通过单例模式实现如下 singleton h Created on 2011 12 24 Author bourneli
  • 删除所有可观察集合?

    我正在寻找可以从 ObservableCollection 中删除所选项目的 Linq 方式 例如 List 的 RemoveAll 方法 我太新了 无法为自己创建扩展方法 有什么方法可以通过 Lambda 表达式从 ObservableC
  • 如何从 /proc/meminfo 计算系统内存使用情况(如 htop)

    运行htop命令以如下格式显示内存使用情况 1 92G 5 83G 问题 我应该如何解释取自的值 proc meminfo为了以编程方式计算所使用的内存 我正在寻找类似的东西 Linux 中以百分比形式准确计算 CPU 使用率 https
  • 从纵向旋转到横向时,iPad 布局会放大

    我有一个添加到 viewport 元标签 width device width initial scale 1 0 在 iPad 上 页面在横向模式下加载得很好 它可以很好地切换到纵向模式 当我将其旋转回横向模式时 它会放大页面 我必须将其
  • 如何从 Android 应用程序中的异步任务返回位图

    好的 这段代码就在 Android 开发者网站上 它设置了一个ImageView to a Bitmap class BitmapWorkerTask extends AsyncTask
  • Flink 的简单 hello world 示例

    我正在寻找 Apache flink 的 hello world 体验的最简单的示例 假设我刚刚在一个干净的盒子上安装了 flink 那么为了 让它做某事 我需要做的最低限度是什么 我意识到这很模糊 这里有一些例子 来自终端的三个 pyth
  • 解决这个问题的正则表达式是什么?

    我有一个 PHP 数组 其 URL 如下所示 http example com apps 1235554 http example com apps apple http example com apps 126734 http examp
  • 如何在 WP7 中分解 URI?

    是否有一种方法可以访问 WebBrowser 控件中的查询参数 或者我们是否必须手动分解字符串 例如 http www mysite com paramter 12345 我只需要访问参数的值 我知道在使用 xaml 页面时我们有 Quer
  • 为什么有两个类:视图模型和域模型?

    我知道使用域模型作为视图模型可能很糟糕 如果我的域模型有一个名为 IsAdmin 的属性 并且我有一个创建控制器操作来创建用户 那么有人可以更改我的表单并使其 POST IsAdmin true 表单值 即使我没有在视图中公开这样的文本字段