爱上MVC3~实体级标准验证

简介:

在MVC架构中,底层数据源一般为linq to sql或者entity frameworks,可能还有少数团队使用自己的ORM工具,但对于实体级的数据验证来说都是必须要干的事,你可能在viewmodel中重复的写一些验证规则,你可能在用ctrl+C和ctrl+V的同时,也知道自己违背了DRY原则,但你可能会说:“这样干容易,简单!“,”我的逻辑复杂,我要分情况去考虑幼!”,呵呵,这些对于我来说,都是借口,违背就是违背,可能有些时候需要去违背原则,就像SQL非范式一样,但今天要说的是,如何为一个实体对象,设计一个完整统一的验证规则,我之前写过一些实体验证的东西,而今天说的,主要还是使用“attribute"来实现这个验证!

对于linq to sql,ef的开发者来说,实体对象会为我们自己生成,而我们对实体的验证不可能写在生成的实体中,因为只要实体要去从数据库更新,你所作的修改就徒劳了,呵呵 ,还要小微早就为我们考虑到了,所以,所有的实体类都是partial class,我们喜欢叫它“分部类”。

一些的效果为:

而一般我们的作法是把验证信息写在ViewModel里,即一个View写一个Model,再添加一些验证信息,而这认为这需要具体问题具体分析了,我们不应该将所以业务都去重新抽象,这样无疑加大了代码量,也破坏了实体完整性,一个东西为何拆成多个?

事实上,数据验证这种事,我们往往应该把它放在数据模型层去干这事,即Entity(Model)层,它体现了数据库的抽象,包括DATA层在内的所有层都可以去引用它,它只是数据库的映射与数据有效性的验证,不存在数据的操作,而操作这种事我们留给了DATA层,而根据业务去组合操作这种事我们交给了BLL(Service)层!

OK,我们来看一下,我在Entity层对实体的设计:

 1 namespace Role.Entity
 2 {
 3     /// <summary>
 4     /// WorkFlow_Info数据有效性验证
 5     /// </summary>
 6     public class WorkFlow_Info_Meta
 7     {
 8         public int ID { get; set; }
 9         public Nullable<int> PrevNode { get; set; }
10         public Nullable<int> NextNode { get; set; }
11         [Required(ErrorMessage = "请填写工作流名称")]
12         [Display(Name = "工作流名称")]
13         public string Name { get; set; }
14         public string Info { get; set; }
15     }
16     /// <summary>
17     /// 工作流实体
18     /// </summary>
19     [MetadataType(typeof(WorkFlow_Info_Meta))]
20     public partial class WorkFlow_Info
21     {
22         #region 导航属性
23         /// <summary>
24         /// 是否为首结点
25         /// </summary>
26         public bool IsFirstNode
27         {
28             get
29             {
30                 return this.PrevNode == null;
31             }
32         }
33         /// <summary>
34         /// 是否为尾结点
35         /// </summary>
36         public bool IsEndNode
37         {
38             get
39             {
40                 return this.NextNode == null;
41             }
42         }
43 
44         #endregion
45     }
46     /// <summary>
47     /// 工作量实体扩展
48     /// </summary>
49     public class WorkFlow_Info_Ext : WorkFlow_Info
50     {
51     }
52 }

好了,而对于前台提交表单时,只要调用ModelState对象的IsValid属性即可验证前台模型了,呵呵!

 1        [HttpPost]
 2         public ActionResult Edit(WorkFlow_Info entity)
 3         {
 4             if (ModelState.IsValid)
 5             {
 6                 repository.Update(entity);
 7                 return RedirectToAction("Index");
 8             }
 9             return View();
10         }

 本文转自博客园张占岭(仓储大叔)的博客,原文链接:爱上MVC3~实体级标准验证,如需转载请自行联系原博主。

目录
相关文章
|
网络性能优化 网络架构 网络协议
|
网络安全
阿里云esc云服务器IP不能访问的解决办法
问题:阿里云服务器,专有网络,web设置完毕,在服务器中localhost能够访问,并且关闭防火墙,但是使用公网ip无法访问。 解决:找到本实例安全组,配置规则,按照要求填入80或其他端口。配置完成后,能使用公网ip加端口访问       本文转自CoderZh博客园博客,原文链接:http://www.
5193 0
|
缓存 安全 API
GET 请求和 POST 请求的安全性有何区别?
【10月更文挑战第29天】GET请求和POST请求在安全性方面各有特点和风险。在实际应用中,应根据具体的业务场景和安全需求,合理选择使用GET请求或POST请求,并采取相应的安全措施来保障系统的安全性,如对敏感信息进行加密、实施访问控制、防范CSRF攻击等。
|
数据可视化 数据挖掘 Python
Python用 tslearn 进行时间序列聚类可视化
Python用 tslearn 进行时间序列聚类可视化
|
JavaScript 前端开发 测试技术
使用 Vue CLI 脚手架生成 Vue 项目
通过 Vue CLI 创建 Vue 项目可以极大地提高开发效率。它不仅提供了一整套标准化的项目结构,还集成了常用的开发工具和配置,使得开发者可以专注于业务逻辑的实现,而不需要花费大量时间在项目配置上。
378 7
使用 Vue CLI 脚手架生成 Vue 项目
|
Docker 容器
NSS [第五空间 2021]pklovecloud
NSS [第五空间 2021]pklovecloud
182 0
线性规划求解第一的MindOpt如何使用Python语言的API建模及优化
MindOpt是一款高效的优化算法软件包,求解算法实现了线性规划(LP)、混合整数线性规划(MILP)、二次规划(QP),可以支持命令行、c、c++、java和python调用。接下来我们将发布一系列文章,讲述各个语言如何使用 MindOpt 来求解数学规划问题
线性规划求解第一的MindOpt如何使用Python语言的API建模及优化
|
资源调度 JavaScript IDE
使用Vue3+TS重构百星websocket插件(下)
使用Vue3+TS重构百星websocket插件(下)
使用Vue3+TS重构百星websocket插件(下)
|
存储 芯片 UED
STM32三种BOOT启动模式详解(全网最全)
一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。
2639 0
STM32三种BOOT启动模式详解(全网最全)

热门文章

最新文章