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

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(使用前将#替换为@)

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

  • 使用资源字符串的 DisplayFormat 数据注释

    我想使用 DisplayFormat 数据注释来格式化模型数据 但我想使用资源文件中存储的格式字符串 我已经能够将资源类型和名称传递给某些数据注释 例如指定错误消息时 如何告诉 DisplayFormat 从我的资源文件之一获取格式字符串
  • 如何重新包含排除的文件夹

    所以我只是无意中点击了我的项目的致命一击Exclude From Project代替Add在我的控制器文件夹中 当尝试添加名为 Controllers 的文件夹时 我收到错误 此文件夹存在 但是 如果我尝试单击该项目 gt Add Exis
  • Web API 和 ASP MVC 之间的主要区别是什么

    标题确实总结了我的问题 我已经使用了这两种技术 但我不确定其中一种技术与另一种技术有何显着不同 在本质上 在设计一个宁静的 Web 应用程序时 选择 ASP MVC 或 Web API 时应考虑哪些标准和 或指南 Purpose ASP N
  • System.Web.Mvc.HtmlHelper 不包含以下定义

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 关于编辑可变长度列
  • ViewModel 的列表在操作中为 null

    我正在开发我的第一个 ASP NET MVC 3 应用程序 我有一个如下所示的视图 model IceCream ViewModels Note NotesViewModel using Html BeginForm Html Valida
  • 如何使用 DropDownListFor

    我想向网页添加下拉列表 html 控件 并用产品列表填充它 我的动作控制器看起来像 public ActionResult Index return View repository GetProducts true 产品模型 Linq to
  • If else 在 Web 网格列中

    如何在 webgrid 列中添加条件 if else grid GetHtml tableStyle table table bordered columns grid Columns grid Column RealName Name g
  • 来自控制器的 Rails 验证

    有一个联系页面 可以输入姓名 电话 电子邮件和消息 然后发送到管理员的电子邮件 没有理由将消息存储在数据库中 问题 如何 在控制器中使用 Rails 验证 根本不使用模型 或者 在模型中使用验证 但没有任何数据库关系 UPD Model c
  • 从 Orchard 内的主题渲染图像

    我刚刚选择 Orchard 来构建我的博客 作为创建这个新博客的努力的一部分 我正在创建一个自定义主题 这个自定义主题同时具有 CSS 和图像 我的问题 我的问题基本上可以归结为 如何渲染属于主题一部分的图像 到目前为止我已经尝试过的 我尝
  • Django dumpdata 和 loaddata 不适用于多对多中介模型

    我在以下模型上将 dumpdata 与 Django 1 2 3 一起使用 class Bar models Model class Foo models Model bars models ManyToManyField Bar thro
  • OutputCache 因复杂对象属性而异

    我有一个控制器操作 它接收一个复杂对象作为参数 我需要 OutputCache 根据该复杂对象的属性之一而变化 这可能吗 如何 如果你有一个像这样的模型 public class person public string Name get
  • Asp.Net MVC3 Razor - 子项目列表未从编辑器发回

    我正在尝试在 MVC3 中创建一个多级编辑器 我所说的多级是指我希望能够编辑三个层次结构级别的数据 父对象 父对象的子对象和子子对象的集合 我的模型大致如下 namespace MvcApplication1 Models public c
  • 使用自定义VirtualPathProvider加载嵌入资源部分视图

    我编写了自定义 VirtualFile 和 VirtualPathProvider 实现 它们成功获取了部分视图的嵌入式资源 但是 当我尝试渲染它们时 它会产生以下错误 The view at Succeed Web Succeed Web
  • 主干关系事件未触发?

    class TheModel extends Backbone RelationalModel relations type Backbone HasMany key subModels relatedModel SubModel coll
  • MVC 3 Razor - 如何阻止视图引擎搜索 aspx 和 ascx 页面?

    我在视图中遇到了一个小错误 并注意到视图引擎不仅搜索我的 razor 视图 还搜索 aspx ascx 页面 我的bug已修复 有没有办法告诉它只搜索 Razor 视图引擎 以下是显示的错误消息 The view Index or its
  • 如何获取 Html.Editorfor 的日期选择器

    在我的 MVC3 剃刀页面上 我有一个日期字段 Html EditorFor model gt model Member Dob 下面给出的是我试图获取出生日期字段的日期选择器的代码 Scripts jquery validate min
  • 在 MVVM 中,可以在视图后面的代码中访问 ViewModel 吗?

    在 MVVM 模式中 是否可以接受甚至可以访问视图代码后面的 ViewModel 属性 我有一个可观察的集合 它填充在 ViewModel 中 我需要在视图中使用它来绑定到带有链接列表的无限滚动条 IE private LinkedList
  • 使用 Razor View Engine 将内容从部分视图 ASP.NET MVC 3 注入特定部分

    我在我的中定义了此部分 Layout cshtml RenderSection Scripts false 我可以轻松地从视图中使用它 section Scripts Stuff comes here 我正在努力解决的是如何从部分视图中注入
  • 将错误消息添加到@Html.ValidationSummary

    我使用标准 MVC3 Razor 视图和不显眼的 Javascript 验证 使用 Html ValidationSummary将它们显示在表单顶部 如果标准验证 例如 Required 通过 然后我运行一些非常自定义的客户端验证 当用户点
  • 通过单击两次提交来避免在 Asp.net MVC 中重复提交表单

    我正在 Asp net MVC 中渲染一个带有提交按钮的表单 成功将记录添加到数据库后 页面将重定向 以下是代码 HttpPost public ActionResult Create BrandPicView brandPic if Mo

随机推荐

  • 如何让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 表单值 即使我没有在视图中公开这样的文本字段