HTML5技术

.Net高级进阶,教你如何构建企业模型数据拦截层,动态控制字段验证 - 小曾看世界(2)

字号+ 作者:H5之家 来源:H5之家 2017-08-25 17:00 我要评论( )

梳理下思路,大致有几种,第一种是用某种手段控制类中的这些验证特性,或者控制类中的属性字段,如启用或停用,但是c#不能对属性字段进行停启用,而控制类中的这些验证特性也有点天方夜谭,本身就是微软封装好的,

 梳理下思路,大致有几种,第一种是用某种手段控制类中的这些验证特性,或者控制类中的属性字段,如启用或停用,但是c#不能对属性字段进行停启用,而控制类中的这些验证特性也有点天方夜谭,本身就是微软封装好的,你得反编译一下看下源码,然后重构?或者你直接不用这些框架封装好的验证特性,使用自己定义自定义验证特性,然后把控制方法都写在里面?这样太麻烦,而且违背初衷。自定义ModelBinder ?更扯淡。

一番折腾无果,那么就不能从特性本身找突破口了,这时,我把目标转移到ModelState.IsValid上,换一种思路实现。

我们发现其实现了GetEnumerator方法,于是对其进行遍历,可以获取到特性所绑定的字段属性的名称以及其状态。

因为要实现自由控制需要验证的字段,所以无论怎样实现,都只能通过 自定义特性 标注在方法体头上来实现。

而理想的最终呈现效果应该是这样的:

放图:

 

或者

 

 

使用方式:

如果方法头上有KeepZ特性的话,就进入自由控制验证字段状态。

 

[KeepZ("字段1","字段2")]  即:只对  字段1 和 字段2   进行验证

[KeepZ(false,"字段3")]  即:除了  字段3  之外,其余字段都进行验证

 

 

那么我们放下具体实现代码:

 

OnActionExecuting(HttpActionContext actionContext) { ) || actionContext.ActionDescriptor.ActionName.ToUpper().Contains() || actionContext.ActionDescriptor.ActionName.ToUpper().Contains())) { var ia = actionContext.ActionDescriptor.GetCustomAttributes<KeepZ>(); if (ia.Count != 1) { goto result; } foreach (KeyValuePair<string, ModelState> item in actionContext.ModelState.ToArray()) { if (ia[0].Modes == false) { foreach (string PropertysValue in ia[0].Propertys) { if (item.Key.Contains(PropertysValue)) { actionContext.ModelState.Remove(item.Key); } } } else { bool re = false; foreach (string PropertysValue in ia[0].Propertys) { if (item.Key.Contains(PropertysValue)) { re = true; } } if (re == false) { actionContext.ModelState.Remove(item.Key); } } } result: if (!actionContext.ModelState.IsValid) { actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState); } } }

保持 KeepZ : Attribute { public string[] Propertys = null; public bool Modes = true; public KeepZ(params string[] Property) { Propertys = Property; } public KeepZ(bool Mode, params string[] Property) { Propertys = Property; Modes = Mode; } }

如此一来,就需要再重建Model这样低端的方法了,现在MVC架构大多都用这种验证模式,但是却没有  自由选择验证字段的解决方案,每每遇到该情况,只能无奈重新建个实体类,对比之下,根本没有食得这种拦截层模型验证的精髓,只学个模子,反而弄巧成拙不成本意,所以我写了此篇和大家一起分享,加入了KeepZ来控制需要验证的字段,就是真正的实现了  可 复用  ,逻辑与拦截分层  了。

Demo虽小,但是这种情况下的解决方案,我在博客园中没找到,应该是园子里第一篇吧。

 

作者:小曾
出处: 欢迎转载,但任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问或者授权方面的协商,请

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • ASP.NET Core 使用Cookie验证身份 - Sweet-Tang

    ASP.NET Core 使用Cookie验证身份 - Sweet-Tang

    2017-08-24 17:00

  • .Net,Dll扫盲篇,如何在VS中调试已经编译好的dll? - 小曾看世界

    .Net,Dll扫盲篇,如何在VS中调试已经编译好的dll? - 小曾看世界

    2017-08-20 12:02

  • 升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署 - 王杰光

    升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署 - 王杰

    2017-08-18 10:01

  • .Net大局观(2).NET Core 2.0 特性介绍和使用指南 - L.P.Y

    .Net大局观(2).NET Core 2.0 特性介绍和使用指南 - L.P.Y

    2017-08-17 17:01

网友点评
n