ASP.NET MVC 3.0验证

MVC Model数据验证

    MVC Model数据验证已经实现了前后台统一验证,那为什么我又要重新实现一个呢,因为我懒,不想去写一个个Model,总结不方便的地方如下:

1.  一个form页面要写一个model,不能重用.

2.  验证和提示信息都写在特性上,书写麻烦,修改一个信息也要重新编译,当然你可以读取xml,但还是麻烦,当提示信息写在xml里,修改时要找,检查时不直观,多加一个验证还是要编译

关于Model验证可以参考: Asp.net MVC2学习笔记8-数据验证(前后台统一验证)

我想要的验证

    微软的Model 验证需要在html页面写:

@Html.ValidationMessage("UserName")

也就是程序要对 那一个控件进行验证,既然写都写了,为什么不把所有验证信息都写在这呢,由此就产生了这篇文章的想法,我希望在页面这样写:

        @VD1.Bind("UserName").NotEmpty("用户名不能为空"). MinLength(5).ToString()

这句的意思是:对UserName验证,不能为空,最小长度5.这样每个页面管好自己就行.优点如下:

1.不用多余的后台代码,有代码提示,点点就搞定.

2.html里的提示和记在xml效果一样,而且检看时直观.

3.很多时候一个重要的项目,你不敢更新整个项目,但更新一个页面,大家都轻松,反正这个我感受比较深.

4.提示信息可以不写,有默认的.

    5.自己生成js可控性强,比如你想改成对话框显示信息,或者右下角提示,写几个重载都可以轻松搞定.

围绕着这个想法,就有了此类的实现,部分代码如下:

1.  验证项的接口

public interface IUniValidate

    {

        #region验证接口

        ///<summary>最后必需调用</summary>

        MvcHtmlString ToString();

        ///<summary>不能为空</summary>

        IUniValidate NotEmpty(string message = "不能为空");

      …

2.  验证项

public class UniValidate : IUniValidate

{

     …

                ///<summary>不能为空</summary>

        public IUniValidate NotEmpty(string message)

        {

            if (isNew)

            {

                AddJs("required", "true", message);

                ValidE += (HttpRequestBase request) =>

                {

                    if (request[_inputName] == null || request[_inputName].Length == 0) AddErrStr(message);

                    return checked1;

                };

            }

            return this;

        }

     …

之所以可以实现前后台统一验证,原理就在这,增加前台的js和后台验证所需的匿名方法,然后返回自己

3.验证Helper

        public class UniValidateHelper

         {

             private static Dictionary<string, Dictionary<string, UniValidate>> all_valids = new Dictionary<string, Dictionary<string, UniValidate>>();

             private static Dictionary<string, string> all_Js = new Dictionary<string, string>();

    public bool CheckAll(Controller contr)

        {

            bool res = valids.Count > 0;

            foreach (var item in valids)

            {

                lock (item.Value)

                {

                    item.Value.checked1 = true;

                    item.Value.errStr = "";

                    if (item.Value.ValidE != null) res = item.Value.ValidE(contr.Request) && res;

                    ErrStr += item.Value.errStr;

                }

            }

            contr.ViewData["ErrStr"] = ErrStr;//asp.net下没有contr.ViewBag

            return res;

        }

            缓存验证项,验证相关的一此方法

调用及注意事项

1.  html页面js引用,母板里引用即可

<script src="http://www.cnblogs.com/Scripts/jquery-1.4.4.js" type="text/javascript"></script>

<script src="http://www.cnblogs.com/Scripts/jquery.validate.js" type="text/javascript"></script>

<script src="http://www.cnblogs.com/Scripts/jquery.validate.messages_cn.js" type="text/javascript"></script>

<script src="http://www.cnblogs.com/Scripts/jquery.validate.extension.js" type="text/javascript"></script>

2.  新建验证对象

UniValidateHelper VD1 = new UniValidateHelper("Valid/Index", Request["refresh"] != null);

或者

UniValidateHelper VD1 = new UniValidateHelper(ViewContext.RouteData, Request["refresh"] != null);

3.  控件验证如

@VD1.Bind("UserName").NotEmpty("用户名不能为空").MinLength(5).ToString()

4.  服务端错误信息,母板里写一次就可,也可以不显示,因为只有很少的情况会绕过端验证,比如js实效,人为攻击等

@ViewData["ErrStr"]

5.  客户js输出,json验证规则

@VD1.ValidEnd()

6.  服务端验证

UniValidateHelper vd = new UniValidateHelper(this.RouteData);

        bool rs=  vd.CheckAll(this);

最后

    具体看源码,类非常简单,写的时候就以简单实用为原则,生成的js验证用的是jquery.validate插件,个人感觉还是非常强大的,当然你也可以自己修改使用其他的验证库,类还有很多不足,您有什么建议请留在回复里,你的参与也许会使这个类 更加完善及强大,虽然感觉已经很强大了,开个玩笑.

    代码的风格可能不合你意,但请不要骂娘,你可以自己改进,至少比重新写省事

        比如这样的注释///<summary>不能为空</summary>  为了减少行数,为了折叠后还可以看的到

项目环境:vs2010,mvc3.0

    [源码下载]

支持的所有验证如下

View Code
复制代码
publicinterface IUniValidate
    {
        ///<summary>最后必需调用</summary>
        MvcHtmlString ToString();
        ///<summary>不能为空</summary>
        IUniValidate NotEmpty(string message ="不能为空");
        ///<summary>是否为Email格式</summary>
        IUniValidate EmailAddress(string message ="必需为Email格式");
        ///<summary>正则验证</summary>
        IUniValidate Regex(string regex, string message ="不正确");
        ///<summary>中文</summary>
        IUniValidate AllChinese(string message ="必需为中文");
        ///<summary>与另一个控件值是否相等</summary>
        IUniValidate EqualTo(string equalElement, string message ="不相同");
        ///<summary>不能与另一个控件相等</summary>
        IUniValidate NotEqualTo(string equalElement, string message ="不能相同");
        ///<summary>不能小于最小值</summary>
        IUniValidate Min(int num, string message ="数字太小");
        ///<summary>不能大于最大值</summary>
        IUniValidate Max(int num, string message ="数字太大");
        ///<summary>长度不能小于</summary>
        IUniValidate MinLength(int num, string message ="长度太短");
        ///<summary>长度不能大于</summary>
        IUniValidate MaxLength(int num, string message ="长度太长");
        ///<summary>验证长度在指定的区间内</summary>
        IUniValidate Length(int min, int max, string message ="长度不正确");
        ///<summary>身份证号码验证</summary>
        IUniValidate IsIDCardNo(string message ="不是有效的身份证");
        ///<summary>远程验证 使用post方式 根据远程返回的Boolen值进行验证 true:表示可以提交,不显示错误提示 false:表示不可以提交,显示错误提示</summary>
        IUniValidate Ajax(string url, string message);
        ///<summary>日期验证</summary>
        IUniValidate Date(string message ="日期不正确");
        ///<summary>网址验证</summary>
        IUniValidate Url(string message ="网址不正确");
        ///<summary>Decimal 型数字验证</summary>
        IUniValidate Decimal(string message ="不是有效的数字");
        ///<summary>检测是否为IP地址</summary>
        IUniValidate IsIP(string message ="IP不正确");
        ///<summary>不包含Html代码</summary>
        IUniValidate NoHtml(string message ="不能包含标示符");
        ///<summary>不能包含中文或全角字符验证</summary>
        IUniValidate NoChinese(string message ="不能是中文");
        ///<summary>判断是否是标准字符 如果包含非标准字符 报错</summary>
        IUniValidate IsLegalXmlString(string message ="xml格式错误");
        ///<summary>非 正则表达式,即不匹配此正则</summary>
        IUniValidate NotRegex(string regex, string message);
        ///<summary>Char最大长度</summary>
        IUniValidate CharCodeLength(int num, string message ="长度不正确");
    }
复制代码

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值