基于easyui的webform扩展(续)

回顾

  《前端基于easyui的mvc扩展》《前端基于easyui的mvc扩展(续)》《基于easyui的webform扩展》这几篇讲解了如何在mvc以及web form内来实现前端使用easyui以及在后端使用基于ValidationAttribute进行验证(mvc本身就有支持),但是这都是以Framework4.0为基础的,那么当我们遇到3.5或者是更早以前的版本的时候,现在这套应用就需要重新重构了。

  首先来梳理一下整个流程,大致的流程如下:

  1. 通过调用需要展示的控件方法
  2. 解析属性上的验证元数据
  3. 生成符合easyui验证规则的html
  4. 提交表单到后端
  5. 对表单转化后的对象进行验证
  6. 如果通过验证则可以对对象进行操作,不通过则直接返回

  mvc和web form在前端的方式基本上都是用一样的,那么也就是说要让我们编写的代码能支持更多的版本的情况下,假如我们自己实现一套验证特性的话,那么只要让前端生成的规则保持一致,后端的话,只有web form是自己去验证这一步的。

实现

  那么参考前几篇的结果以及ValidationAttribute,我们很快便能整理出一套跟ValidationAttribute相似的验证特性了,部分代码如下:

//验证基类[AttributeUsage(AttributeTargets.Property,AllowMultiple=true,Inherited=false)]publicabstractclassCustomValidationBaseAttribute:Attribute{privateobject m_Model =null;protectedobjectModel{get{return m_Model;}}privatestring m_ErrorMessage =null;publicstringErrorMessage{get{return m_ErrorMessage;}set{ m_ErrorMessage = value;}}publicboolIsValid(object model,object value){if(model ==null)returnfalse;

        m_Model = model;returnIsValid(value);}publicvirtualstringFormatErrorMessage(string displayName){returnstring.Format(ErrorMessage, displayName);}protectedabstractboolIsValid(object value);}//必填特性[AttributeUsage(AttributeTargets.Property,AllowMultiple=false,Inherited=false)]publicclassCustomRequiredAttribute:CustomValidationBaseAttribute{protectedoverrideboolIsValid(object value){return value !=null&&!string.IsNullOrEmpty(value.ToString());}}

  有了特性,那么接下来只要根据不同的环境,来生成相同的easyui验证规则就可以了。

  首先分析一下各种控件的规则,主要有以下3种情况:

  1. linkbutton这种不需要进行数据绑定,只要显示文本或某些属性的
  2. validatebox、numberbox、combobox等是需要解析表达式,在model存在的情况下,要显示出值的
  3. Label只要显示属性上配置的DisplayName的,虽然不是easyui的控件,但是2里面的控件共用表达式树的解析

  其实以上2-3的区别仅仅是在控件上添加一个属于easyui的样式表而已,于是使用如下2中类来区分以上3种情况,代码如下:

internalclassBuilderBase{publicBuilderBase(string tag,string attributeJson):this(tag,null, attributeJson){}publicBuilderBase(string tag,string control,string attributeJson){//省略,文章最后提供详细源码}//扩展Builder,比如Linkbutton要添加文本或其他编辑控件要增加name及验证规则protectedvirtualvoidExpandFor(TagBuilder builder){}}internalclassParseExpressionBuilder:BuilderBase{publicParseExpressionBuilder(string tag,Expression<Func<TModel,object>> expression,string attributeJson):this(tag,null, expression,default(TModel), attributeJson){}publicParseExpressionBuilder(string tag,string control,Expression<Func<TModel,object>> expression,TModel model,string attributeJson):base(tag, control, attributeJson){//略}protectedoverridevoidExpandFor(TagBuilder builder){//略}//此方法用来处理不同控件的绑定值操作protectedvirtualvoidAppendValue(refTagBuilder builder,object value){if(value !=null)
builder.AddAttribute("value", value.ToString());}}

  这里将具体的生成规则都放在了一些列的Builder内,但是为了保证在mvc和web form内能生成相同easyui的easyui规则,由于我们自定义的规则是参考ValidationAttribute的,因此我们只要根据接口来实现我们自定义的那一部分就可以了,其实只要适当的修改第一篇文章内的生成规则便可以完工了,部分代码如下:

//这里挑选了必填验证的代码,跟之前的相比仅仅是验证特性的对象不同而已var attribute = validationAttrs.FirstOrDefault(attr => attr isCustomRequiredAttribute);if(attribute !=null){
tag.AddAttribute("required","true");
tag.AddAttribute("missingMessage", attribute.ErrorMessage);}

  而上篇提到的EasyUIHelper仅仅是提供给外部生成的公用方法而已,它的代码大致如下:

publicclassEasyUIHelper{publicstaticstringLabel(Expression<Func<TModel,object>> expression,string attributeJson){returnnewLabelBuilder(expression, attributeJson);}publicstaticstringValidateText(Expression<Func<TModel,object>> expression,TModel model,string attributeJson){returnnewValidateboxBuilder(expression, model,"text", attributeJson);}//针对3.5的其他重构和其他方法省略,具体请看源码}

  完成了前端的生成规则以后,接下来就是对于后端验证进行重构了,代码与之前的差别不大,仅仅是把原本基于ValidationAttribute改为基于CustomValidationBaseAttribute来完成,为了节省篇幅代码就不写了,具体的可以查看源码。

结尾

  由于本篇是基于前几篇的一个总结和对之前版本的兼容,因此内容相对比较少,如果对这几篇的内容有什么问题请指出,谢谢大家,另外源码在此(从代码库中抽出来的一部分)。

 
 
分类: C#想法

基于easyui的webform扩展(续)的更多相关文章

  1. 基于easyui的webform扩展

    基于easyui的webform扩展 回顾 <前端基于easyui的mvc扩展>.<前端基于easyui的mvc扩展(续)>前两篇介绍了mvc内如何基于easyui进行扩展,在 ...

  2. 前端基于easyui的mvc扩展(续)

    前端基于easyui的mvc扩展(续) 回顾及遗留问题 上一篇讲解了基于easyui的mvc扩展的基本实现,已经降低了在mvc内使用easyui的难度,但是仍然还有一些问题: 当我们要给生成的控件设置 ...

  3. 基于easyui的验证扩展

    基于easyui的验证扩展 ##前言 自己做项目也有好几年的时间了,一直没有时间整理自己的代码,趁春节比较闲,把自己以前的代码整理了一篇.这是基于easyui1.2.6的一些验证扩展,2012年就开始 ...

  4. 前端基于easyui的mvc扩展

    背景 由于MVC的前端是基于jquery.validate和jquery.validate.unobtrusive来实现的,但是当我们要使用其他的ui组件且组件本身就带有完整的验证功能的话,那么要让它 ...

  5. 基于EasyUI Treegrid的权限管理资源列表

    1. 前言 最近在开发系统权限管理相关的功能,主要包含用户管理,资源管理,角色管理,组类别管理等小的模块.之前的Web开发中也用过jQueryEasyUI插件,感觉这款插件简单易用,上手很快.以前用到 ...

  6. ABP 初探 之基于EasyUI的CURD

    结束了天天加班的项目,项目虽然结束,但还是有点小问题,只能在后期优化当中完成了,本次做项目采用了,MVC.Webapi.Entityframework,在园了里看到了有关ABP的介绍,同样ABP也是最 ...

  7. 基于Spring的可扩展Schema进行开发自定义配置标签支持

    一.背景 最近和朋友一起想开发一个类似alibaba dubbo的功能的工具,其中就用到了基于Spring的可扩展Schema进行开发自定义配置标签支持,通过上网查资料自己写了一个demo.今天在这里 ...

  8. 基于EasyUI实现windows桌面

    之前为大家介绍了 基于jquery tool实现的windows桌面效果,今天给大家带来一款基于EasyUI实现windows桌面.这款桌面适用浏览器:360.FireFox.Chrome.Safar ...

  9. 基于 HtmlHelper 的自定义扩展Container

    基于 HtmlHelper 的自定义扩展Container Intro 基于 asp.net mvc 的权限控制系统的一部分,适用于对UI层数据呈现的控制,基于 HtmlHelper 的扩展组件 Co ...

随机推荐

  1. [Asp.net]站点地图SiteMap

    原文:[Asp.net]站点地图SiteMap 引言 在项目中发现使用站点地图的控件,之前没总结过这方面的东西,就写了一个demo测试了一下,这里记录一下,算是总结吧. Web.sitemap < ...

  2. LCD开发之汉字显示

    一.LCD显示原理 利用液晶制成的显示器称为LCD,根据驱动方式可分为静态驱动.简单矩阵驱动以及主动矩阵驱动3种.当中,简单矩阵型又可再细分扭转向列型(TN)和超扭转式向列型(STN)两种,而主动矩阵 ...

  3. .net下二进制序列化的格式分析[转]

    .net下二进制序列化的格式分析[转] -- 综合应用 (http://www.Host01.Com/article/Net/00020003/) --- .net下二进制序列化的格式分析 (http ...

  4. angular.js的一点理解

    对angular.js的一点理解 2015-01-14 13:18 by MrGeorgeZhao, 317 阅读, 4 评论, 收藏, 编辑 最近一直在学习angular.js.不得不说和jquer ...

  5. PHP Warning: strtotime(): It is not safe to rely on the system's timezone settings.

    有三种解决办法: 1. php文件中设置时区 <?php date_default_timezone_set('Asia/Shanghai'); echo strtotime('2012-9-3 ...

  6. jQuery EasyUI API - Grid - DataGrid [原创汉化官方API]

    最近在学习jQuery EasyUI,发现中文的文档好少,部分文档不错但它是鸟语的,为了大家也为了自己学习吧,汉化做一下笔记. 有没有说清楚的,或者翻译不正确的地方还请大家谅解指出.. 由于工作时间原 ...

  7. Java 多并发之原子访问(Atomic Access)

    在编程中,一个原子操作是只会出现一次的.一个原子操作在中间不会停止:要么全部发生要么一点也不发生.我们只有在原子操作完成之后才会看到原子操作的具体影响. 甚至是非常简单的表达式能够构造分解为简单操作的 ...

  8. 初识Python-web框架的这两天

    前段时间打算学习python,其实时间蛮紧张的,看看文字教程,累了就看视频教程.算是把基本的语法过了一遍,但是OOP就费了好大的气力 ,C里有的对象,继承,等等等,还算能理解.不过高级点的就理解起来吃 ...

  9. Xamarin移动跨平台解决方案是如何工作

    Xamarin移动跨平台解决方案是如何工作的? 概述 上一篇 C#移动跨平台开发(1)环境准备发布之后不久,无独有偶,微软宣布了开放.NET框架源代码并且会为Windows.Mac和Linux开发一个 ...

  10. 【Android开发日记】妙用 RelativeLayout 实现3 段布局

    在设计过程中,我们经常会遇到这样的需求: 把一条线3控制,左对齐左控制,右侧控制右对齐,中间控制,以填补剩余空间. 或者一列内放3个控件,上面的与顶部对齐,以下的沉在最底部,中间控件是弹性的.充满剩余 ...