Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Asp.NET MVC - DataAnnotations和ModelState.IsValid太侵入领域模型了吗?

Asp.NET MVC - DataAnnotations和ModelState.IsValid太侵入领域模型了吗?
EN

Stack Overflow用户
提问于 2013-12-28 00:16:08
回答 3查看 3.1K关注 0票数 5

我正在从“ASP.NET”(顺便说一句)一书中学习Pro ASP.NET MVC 4 MVC (顺便说一句,我很喜欢它)。

我仍然处于开头的章节中,它将向我展示System.ComponentModel.DataAnnotations名称空间属性,如何在我的模型类中洒上这些注释,然后如何使用它们来检查模型是否有效(ModelState.IsValidController中)。

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class GuestResponse
{
    [Required(ErrorMessage = "Please enter your name"]
    public string Name { get; set; }
}

...

public ViewResult RsvpForm(GuestResponse guestResponse)
{
    if(ModelState.IsValid)
    {
        return View("Thanks", guestResponse);

    }

}

有几件事让我感到不安。

  1. 为什么我想要一堆属性散落在我的域模型中?我喜欢我的领域模型是纯的,没有任何特定于实现的东西,任何真实世界的模型都太复杂了,不能像这样使用声明式验证。
  2. 验证属性的ErrorMessage参数不是与View有关吗?这样的东西不属于UI层吗?对于example...what,如果由于空间限制,我希望移动版本不要说“请输入您的名字”,比如“需要的名称”?但它就在我的模型里!
  3. 为什么我要使用ModelState.IsValid来确定模型的状态?模特不应该告诉我吗?我知道ModelState正在使用我的模型中的DataAnnotations属性,但这似乎只适用于非常简单的模型。一个更复杂的模型甚至可能没有有效/无效的状态,它可能只是有不同的阶段和状态。我在这里有点杂乱无章,但我不喜欢以声明的方式说出什么使我的模型有效或无效。

对这些想法的任何建议、保证或验证都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-28 01:00:39

以下是我对你们问题的回答:

1)为什么我想要一堆属性散落在我的域模型中?我喜欢我的领域模型是纯的,没有任何特定于实现的东西,任何真实世界的模型都太复杂了,不能像这样使用声明式验证。

你绝对不想这样。您想要的是有一个视图模型,它是专门为视图的目的而设计的。这个视图模型将包含数据注释,而不是域模型。然后控制器将映射到域模型和视图模型之间,并将视图模型传递给视图。将视图模型视为一个或多个域模型的投影。为了简化域和视图模型之间的映射,您可以签出AutoMapper。基本的经验法则是视图不应该知道您的域模型。

2)验证属性的ErrorMessage参数不是与视图有关吗?这样的东西不属于UI层吗?对于example...what,如果由于空间限制,我希望移动版本不要说“请输入您的名字”,比如“需要的名称”?但它就在我的模型里!

完全同意你的观点。这就是为什么您应该有一个视图模型类,它是为视图的目的而专门设计的。

3)为什么要使用ModelState.IsValid来确定模型的状态?模特不应该告诉我吗?我知道ModelState正在使用我的模型中的DataAnnotations属性,但这似乎只适用于非常简单的模型。一个更复杂的模型甚至可能没有有效/无效的状态,它可能只是有不同的阶段和状态。我在这里有点杂乱无章,但我不喜欢以声明的方式说出什么使我的模型有效或无效。

我再一次同意你的看法。声明式验证(比如您在数据注释中得到的信息)对于Hello类型的应用程序非常有用,但是一旦您开始用复杂的验证规则编写真实的应用程序,您很快就会意识到,声明式方法根本不会减少芥末。正是因为这个原因,我才使用FluentValidation.NET。它为您提供了一个非常好的、流畅的语法来表达任意复杂的验证规则,它是integrates easily with ASP.NET MVC,并且允许完全隔离的unit test your validation rules

票数 8
EN

Stack Overflow用户

发布于 2013-12-28 00:51:36

数据注释只是实现它的一种方式。您还可以使用Fluent API来定义数据库的模式和映射ER。注释与前端jQuery验证代码紧密耦合,因此方便且容易。的确,如果您不希望在业务逻辑中使用注释,则可以在UI层中使用视图模型。这将完全取决于应用程序的范围和大小,以及最终使用的视图模型的范围。

这里有一些你可以参考的博客来澄清你对EF的疑虑

http://msdn.microsoft.com/en-us/data/jj591620.aspx

希望这能让你走。

票数 1
EN

Stack Overflow用户

发布于 2013-12-28 01:06:36

这个问题的答案很大程度上取决于你想要解决的问题。例如,您的域包含复杂的业务逻辑还是基于CRUD的应用程序。你应该试着为你想要解决的问题挑出最好的。

  1. 我想,在考虑这些“域模型”时,可能有两个极端--它们可以是数据库和UI之间的数据传输对象,也可以是复杂的DDD类型对象,用于建模业务问题。如果他们是前者,那么为什么不保持尽可能简单。另一方面,使用视图和db之间共享的“单一”模型很难很好地实现复杂的业务域。在现实中,你可能处于中间。

是的,是的,但是对于你的“便条”应用程序来说,这有什么关系呢?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20812448

复制
相关文章
访问令牌JWT
By reference token(透明令牌),随机生成的字符串标识符,无法简单猜测授权服务器如何颁 发和存储资源服务器必须通过后端渠道,发送回OAuth2授权服务器的令牌检查端点,才能校验令牌 是否有效,并获取claims/scopes等额外信息
乐心湖
2020/08/02
1.7K0
GitLab 冷知识:在 Gitlab CI Pipeline 中进行 Git Push 操作 🦊
在日常工作中,经常会遇到这样一种场景:需要在 GItLab CI Job 中进行 Git Push 操作,将修改或构建好的代码推送到远端 Git 代码仓库当中。这是一个十分常见操作,本篇文章将会提供一个最简单且实用的方法来实现这个场景,希望对您有所帮助。
郭旭东
2022/12/05
5.5K0
GitLab 冷知识:在 Gitlab CI Pipeline 中进行 Git Push 操作 🦊
Gitlab CI 在 Kubernetes 中的 Docker 缓存
前面我们有文章介绍过如何在 Kubernetes 集群中使用 GitLab CI 来实现 CI/CD,在构建镜像的环节我们基本上都是使用的 Docker On Docker 的模式,这是因为 Kubernetes 集群使用的是 Docker 这种容器运行时,所以我们可以将宿主机的 docker.sock 文件挂载到容器中构建镜像,而最近我们在使用 Kubernetes 1.22.X 版本后将容器运行时更改为了 Containerd,这样节点上没有可用的 Docker 服务了,这个时候就需要更改构建镜像的模式了,当然要实现构建镜像的方式有很多,我们这里还是选择使用 Docker 来构建我们的 Docker 镜像,也就是使用 Docker IN Docker 的模式。
我是阳明
2021/11/17
1.5K0
在 Gitlab CI 中调用 Sonarqube 进行代码扫描
Gitlab 提供了基于 Code Climate 的代码质量评估功能,这一功能是通过 dind(Docker in Docker)方式运行的,在 Kubernetes 环境中、尤其是托管集群中,这种方式不太合适,还好还有一个替代方案:Sonarqube,通过在 .gitlab-ci.yml 中的设置,可以使用 Sonarqube 对代码进行扫描,接收到 Commit 之后,Sonarqube 会生成针对提交的代码质量提示,如图所示:
崔秀龙
2019/07/22
8.1K0
在 Gitlab CI 中调用 Sonarqube 进行代码扫描
Gitlab - 安装的社区版 Gitlab-ce,解决访问网页报502-Whoops, GitLab is taking too much time to respond的问题
在自己虚拟机(centos7)上装了 Gitlab-ce,就是社区版的 Gitlab,版本是 13.0+
小菠萝测试笔记
2021/04/25
5.2K0
Gitlab - 安装的社区版 Gitlab-ce,解决访问网页报502-Whoops, GitLab is taking too much time to respond的问题
持续集成gitlab-ci.yml配置文档基础
[TOC] 0x00 简述 Q:什么是.gitlab-ci.yaml?它有什么作用? 答:gitlab-ci全称是gitlab continuous integration的意思就是持续集成;gitl
全栈工程师修炼指南
2020/10/23
15K1
持续集成gitlab-ci.yml配置文档基础
面向个人开发者应该打造的CICD部署系统
作为一个个人开发者,在业余时间也会想着开发一些个人的好玩的项目,去开发一些效率工具,开发一些自己喜欢的程序,在这个前提下,很多人购买了自己的服务器,作为一个前端开发,在最开始的时候对服务器相对会比较陌生,如果接触不多,在部署自己的项目过程中也会有许许多多的不便,我们也可以为自己搭建一套自动化部署,能够让我们在开发个人项目的时候享受同样的便捷。
Snine
2022/09/28
1.4K0
面向个人开发者应该打造的CICD部署系统
持续集成gitlab-ci.yml配置文档基础
[TOC] 0x00 简述 Q:什么是.gitlab-ci.yaml?它有什么作用? 答:gitlab-ci全称是gitlab continuous integration的意思就是持续集成;gitl
全栈工程师修炼指南
2022/09/29
12.2K0
持续集成gitlab-ci.yml配置文档基础
gitlab配置https方式访问
前提:gitlab我安装的版本是13.*,已可以通过域名访问。 mkdir /etc/gitlab/ssl cp server.crt server.key /etc/gitlab/ssl vim /etc/gitlab/gitlab.rb 修改内容如下: nginx['ssl_certificate'] = "/etc/gitlab/ssl/ebyh.crt" nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/ebyh.key" external_ur
休辞醉倒
2019/07/25
4.6K0
访问令牌过期后,如何自动续期?
JWT是JSON Web Token的缩写,是为了在网络应用环境间传递声明而执行的- -种基于JSON的开放标准((RFC 7519)。JWT本身没有定义任何技术实现,它只是定义了一种基于Token的会话管理的规则,涵盖Token需要包含的标准内容和Token的生成过程,特别适用于分布式站点的单点登录(SSO) 场景。
Tinywan
2023/03/08
2.7K0
访问令牌过期后,如何自动续期?
多分支流水线任务对 GitLab SCM 的支持
这个插件还没有二进制文件可用,因为这个插件还处于非常早期的 alpha 阶段,还没有为公众准备好。如果您想尽早介入,可以尝试自己从源代码构建它。
LinuxSuRen
2019/07/15
1.8K0
多分支流水线任务对 GitLab SCM 的支持
XXL-JOB访问令牌(AccessToken)设置
为提升系统安全性,调度中心和执行器进行安全性校验,双方AccessToken匹配才允许通讯;
Li_XiaoJin
2022/12/28
20.8K0
XXL-JOB访问令牌(AccessToken)设置
C/C++ 实现提升访问令牌权限
在我们编程实现一些系统操作的时候,往往要求我们执行操作的进程拥有足够的权限方可成功操作。比如,我们使用 ExitWindows 函数实现关机或重启操作的时候,就要求我们的进程要有 SE_SHUTDOWN_NAME 的权限,否则,会忽视不执行操作。这时,我们唯一能够做的,就是按照要求,提升我们进程的权限。
微软技术分享
2022/12/28
7900
gitlab访问限制问题------Forbidden
重启-gitlab:       gitlab-ctl restart          
Wyc
2018/09/11
2.5K0
Spring Security的项目中集成JWT Token令牌安全访问后台API
最近接了一个私活项目,后台使用的是Spring Boot脚手架搭建的,认证和鉴权框架用的Spring Security。同时为了确保客户端安全访问后台服务的API,需要用户登录成功之后返回一个包含登录用户信息的jwt token, 用于调用其他接口时将此jwt token携带在请求头中作为调用者的认证信息。最近一个多月一方面在忙着做这个项目,另一方面恰好遇上了精彩的世界杯,也没怎么发文了。很多时候真的深感写篇原创文章比单纯的敲代码麻烦多了,但是好久不更文还是要检讨一下自己的惰性,客服自身的惰性是每个想要突破自我、不甘平庸的普通人的一辈子都不能松懈的重任。
用户3587585
2023/03/09
4.3K0
Spring Security的项目中集成JWT Token令牌安全访问后台API
Ubuntu上如何使用GitLab CI搭建持续集成Pipeline
GitLab Community Edition是一个自托管的Git存储库提供程序,具有帮助项目管理和软件开发的附加功能。GitLab提供的最有价值的功能之一是内置的持续集成和交付工具GitLab CI。
爆栈工程师
2018/08/13
3.9K0
Ubuntu上如何使用GitLab CI搭建持续集成Pipeline
从外部访问Kubernetes中的Pod
本文主要讲解访问kubernetes中的Pod和Serivce的几种方式,包括如下几种:
我的小碗汤
2019/07/30
2.9K0
安装 GitLab CE
DevOps 理念落实得最为彻底的一类案例就是 CI/CD(持续集成/持续交付) 系统
franket
2021/08/12
3.6K0
使用GitLabCI实现monorepos项目CI/CD
基于现代Web的应用程序通常都包含多种服务。例如,后端API和前端客户端。在规模扩大成为问题的大型项目中,服务也可以拆分为多个微服务。如何在这样的项目中组织源代码?一种解决方案是monorepo,即项目中所有源代码在同一个存储库中管理。还有一种是每个微服务分别创建一个存储库管理。
DevOps云学堂
2020/06/19
9.5K0
GitLab 简明维护指南(v2020.05)
本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)
soulteary
2020/05/05
6550
GitLab 简明维护指南(v2020.05)

相似问题

如何从TinyMCE编辑器中获取字数统计?

13

如何在ck编辑器中输入文本时显示字数统计

123

在文本编辑器中显示XML (例如,tinymce,Jquery编辑器) PHP

10

在TinyMCE编辑器中显示视频

1109

如何在tinyMCE编辑器中显示RTF文本

113
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文