ASP.NET MVC Web 应用程序中视图逻辑和域逻辑之间的混淆

2024-03-05

我对域/应用程序逻辑和用户界面逻辑感到困惑。为了说明我想要确定的内容,我将在下面描述一个虚构的程序以供说明:

(1) 想象一个带有一组 3 个级联下拉菜单的小型应用程序。当您选择一个下拉列表时,它会触发 jQuery Ajax GET,最终到达 MVC 控制器,提供先前选择的下拉列表的选定值。控制器返回下一个下拉菜单允许的选择。 javacript(在视图中)将这些结果排列到下拉列表中。等等。因此,每次您选择一个下拉列表时,都会填充下一个下拉列表。

(2) 现在抛出一个扳手..有一些例外。假设用户在第一个下拉列表中选择“FOO”或“BAR”,则行为会发生变化,因此第二个下拉列表将被禁用,而第三个下拉列表将显示一个文本框。

我的问题是,在 MVC 的背景下,这个“决策”逻辑的合适位置在哪里?例如我在 (2) 中解释的负责做出这些决定的代码。我把它放在视图的 javascript 中最方便的地方。我只是编写了 javascript 来测试第一个框是“FOO”还是“BAR”,然后禁用第二个下拉列表,并将第三个下拉列表替换为文本框。但这对我来说感觉不太对劲。因为它看起来应该是业务逻辑,因此代码应该属于域层的某个地方。但这感觉也不太对劲。

所以我觉得我在兜圈子。有人可以解释一下这个小设计吗?


让我们从领域模型开始。领域模型是一种 API,以技术中立的方式对领域进行建模。它对 View 技术一无所知,例如 JQuery、HTML 或(就此而言)XAML 或 Windows 窗体。

领域模型包含描述领域的类和接口,并允许您以丰富且富有表现力的方式对领域概念进行建模 - 无论您正在开发什么类型的应用程序。

考虑到这一点,很容易看出您描述的显示逻辑不属于域模型。因此,它必须属于特定于 UI 的层。

你可以把它放在一个单独的UI Logic模块或与您的 UI 应用程序一起使用 - 在您的情况下是 ASP.NET MVC 应用程序。无论您是在 JavaScript 还是服务器端表达所需的 UI 逻辑,都不太重要。

就我个人而言,我会在部分视图中定义这个逻辑服务器端,但那是因为我非常关心可测试性,并且我知道如何对这种行为进行单元测试(有人告诉我也可以对 JQuery 代码进行单元测试,但我不知道这是否属实)。

如果您最终基于相同的域模型编写另一个应用程序,则显示逻辑很可能会非常不同,因为不同的技术意味着不同的范例。

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

ASP.NET MVC Web 应用程序中视图逻辑和域逻辑之间的混淆 的相关文章

随机推荐

  • 如何中止使用 ThreadPool.QueueUserWorkItem 创建的线程

    有没有办法中止使用 QueueUserWorkItem 创建的线程 或者也许我不需要 如果主应用程序退出会发生什么 从它创建的所有线程都会自动中止吗 你不需要中止它们 当您的应用程序退出时 NET 将终止 IsBackground true
  • ld-linux --验证退出代码

    检查 usr bin ldd 的源代码 我发现它使用 ld linux 来查找可执行文件的依赖项 尽管它首先使用 verify 参数调用 ld linux 然后 脚本根据 ld linux verify 调用的退出代码采取不同的行为 ld
  • HTML5画布,保存jpeg blob并从blob恢复到画布

    我有一块画布 mycanvas其中包含图像 我想从该图像创建一个斑点 最好是 jpeg 格式 这是我创建 blob 的方法 document getElementById mycanvas toDataURL image jpeg repl
  • 比较数组与 jQuery [重复]

    这个问题在这里已经有答案了 可能的重复 javascript中数组交集的最简单代码 https stackoverflow com questions 1885557 simplest code for array intersection
  • 检查 TCP 端口是否可用(未侦听或连接)

    我使用以下代码来检查端口是否可用 bool ClassA CheckPortTCP short int dwPort char ipAddressStr struct sockaddr in client int sock client s
  • 在 C# 中调用 google Url Shortener API

    我想打电话给谷歌网址缩短API http code google com apis urlshortener v1 getting started html从我的 C 控制台应用程序中 我尝试实现的请求是 POST https www go
  • Firestore - 查询时如何在字段上应用“字符串包含”条件?

    Collection Post postId post 124 title World population 2020 如何编写一个查询 返回 标题 字段中包含字符串 世界人口 的帖子 Firestore 不支持此级别的查询 看全文检索 h
  • 从 iOS 应用程序检测附近的移动设备

    是否可以创建一个 iOS 应用程序来扫描附近的移动设备 例如 iPhone Android iPad 等 而无需在附近的移动设备上运行任何自定义应用程序 我尝试过像这样使用 CoreBluetooth 在我的 iPhone 6 上运行 se
  • 如何创建数据类型不是 EMF 类的 EAttribute?

    使用 EMF 我想定义一个属性 其数据类型 EType 在我的 EMF 模型外部 也就是说 我想要的类型是一个普通的手工编码的 Java 类 它不是我的 EMF 模型的一部分 使用AnySimpleType是最后的手段 与使用泛型相比 我想
  • 从一个线程跟踪另一个线程

    进行实验ptrace 系统调用 我试图跟踪同一进程的另一个线程 根据手册页 跟踪器和被跟踪者都是特定的线程 而不是进程 所以我看不出它不应该工作的原因 到目前为止 我已经尝试了以下方法 use PTRACE TRACEME来自clone d
  • 读取会话变量而不使上下文无效

    有没有办法在会话变量发生变化时读取会话变量而无需重新渲染模板 场景 我使用 jQuery 动态更改元素的样式 但是当创建新元素时 我想设置其默认样式 我知道在渲染元素时我可以调用相同的 jQuery 命令 Example
  • C# Visual Studio 如何重新定位 nuget 包文件夹?

    我聘请了一名承包商为我做一些编码 他使用以下存储库路径在解决方案文件夹中设置 nuget config
  • 在 Heroku 中使用特殊字符设置环境变量(通过 powershell)

    Django 1 8 Heroku Powershell 我正在尝试在 Heroku 中为 django 密钥设置环境变量 venv PS WORKFOLDER gt heroku config set SECRET KEY eoik6 d
  • 改变UIView位置的简单方法?

    我使用以下代码更改 UIView 的位置 而不更改视图的大小 CGRect f aView frame f origin x 100 new x f origin y 200 new y aView frame f 有没有更简单的方法来仅更
  • 文本二值化

    I d like to binarize this image to use it with tesseract ocr Currently I managed to get this But I need clear image with
  • SQL Server 2008 Nvarchar(Max) 连接 - 截断问题

    有人可以解释一下为什么在 SQL Server 2008 上会发生这种情况吗 declare sql Nvarchar max set sql N select sql sql replicate a 4000 replicate b 60
  • 使用 Python 请求传递登录名/密码

    我查看了相关答案 但没有找到非常有效的东西 我正在尝试从我的球队的 CBS Sportsline 页面上抓取一些梦幻棒球信息 我想发布登录名和密码 然后当我使用 get 命令时 查看特定于我的帐户的数据 这是我尝试过的 import req
  • 发送对象时忽略 JSON 字段(反序列化)

    我有一个 DTO 对象 public class Rate private final Integer rate private final String user private final Date date 和两个控制器 https
  • 正确处理浏览器资源

    我有一个网络应用程序 可以在很长一段时间内动态加载数据 数据内有图像的链接 然后在浏览器中呈现这些图像 e g var object Name ko observable Foo Ref ko observable Bar ImageUrl
  • ASP.NET MVC Web 应用程序中视图逻辑和域逻辑之间的混淆

    我对域 应用程序逻辑和用户界面逻辑感到困惑 为了说明我想要确定的内容 我将在下面描述一个虚构的程序以供说明 1 想象一个带有一组 3 个级联下拉菜单的小型应用程序 当您选择一个下拉列表时 它会触发 jQuery Ajax GET 最终到达