Mvc提供模型级数据验证

一、服务端验证:

ModelState.IsValid

ModelState.AddModelError("Name", "错误提示")

二、服务端掺杂业务验证:

1将ModelState传入bll层

2 创建一个特定错误类型,在错误处理中操作ModelState

三、实用Attribute进行客户端验证:

jquery-1.4.4.min.js

jquery.validate.js

jquery.validate.unobtrusive.js

jquery.unobtrusive-ajax.js

开启客户端验证

使用Unobtrusive,行动与表现分离

老版本

Html.BeginForm:data-ajax=true  : 异步,否则返回js会弹出下载界面

Html.ValidationSummary: 错误显示位置,false此处及message处都显示,true为仅在message处显示

Model类中可以添加的验证标记:

1. 必填字段

[Required]

public string FirstName { get; set; }

2. 字段长度

至多n位:

[StringLength(160)]

public string FirstName { get; set; }

要求至少n位:(自定义错误提示占位符0为字段名,1为第一个参数,2为第二个参数)

[StringLength(160, MinimumLength=3,ErrorMessage=”{0}长度必须在{1}到{2}之间”)]

public string FirstName { get; set; }

3. 正则验证

[RegularExpression(@”[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}”)]

public string Email { get; set; }

4. 范围

[Range(35,44)]

public int Age { get; set; }

小数的情况:

[Range(typeof(decimal), “0.00”, “49.99”)]

public decimal Price { get; set; }

5. 服务端参与的验证

[Remote(“CheckUserName”, “Account”)]

public string UserName { get; set; }

然后在AccountController里指定一个CheckUserName方法:

public JsonResult CheckUserName(string username)

{

var result = Membership.FindUsersByName(username).Count == 0;

return Json(result, JsonRequestBehavior.AllowGet);

}

6. 比较

[RegularExpression(@”[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}”)]

public string Email { get; set; }

[Compare(“Email”)]

public string EmailConfirm { get; set; }

常用正则:

数字:"^[0-9]*$"。

n位的数字:"^\d{n}$"。

至少n位的数字:"^\d{n,}$"。

m~n位的数字:。"^\d{m,n}$"

零和非零开头的数字:"^(0|[1-9][0-9]*)$"。

有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。

有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。

非零的正整数:"^\+?[1-9][0-9]*$"。

非零的负整数:"^\-[1-9][]0-9"*$。

长度为3的字符:"^.{3}$"。

由26个英文字母组成的字符串:"^[A-Za-z]+$"。

由26个大写英文字母组成的字符串:"^[A-Z]+$"。

由26个小写英文字母组成的字符串:"^[a-z]+$"。

由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。

由数字、26个英文字母或者下划线组成的字符串:"^\w+$"。

验证用户密码:"^[a-zA-Z]\w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。

验证是否含有^%&’,;=?$\"等字符:"[^%&’,;=?$\x22]+"。

只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"

验证Email地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。

验证InternetURL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。

验证电话号码:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。

验证身份证号(15位或18位数字):"^\d{15}|\d{18}$"。

验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。

验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。

四、自定义验证:

1、继承ValidationAttribute
Example:
public class DomainAttribute : ValidationAttribute
  {
      public IEnumerable<string> Values { get; private set; }   
      public DomainAttribute(string value)
      {
          this.Values = new string[] { value };
      }
   
      public DomainAttribute(prams string[] values)
      {
          this.Values = values;
      }
   
      public override bool IsValid(object value)
      {
          if (null == value)
          {
              return true;
          }
          return this.Values.Any(item => value.ToString() == item);
      }
    
      public override string FormatErrorMessage(string name)
      {
          string[] values = this.Values.Select(value => string.Format("'{0}'",value)).ToArray();
        return string.Format(base.ErrorMessageString, name,string.Join(",", values));
     }
  }

public class MaxWordsAttribute : ValidationAttribute

{

public MaxWordsAttribute(int maxWords)

: base("{0} 字符串过长")

{

_maxWords = maxWords;

}

private readonly int _maxWords;

protected override ValidationResult IsValid(object value, ValidationContext validationContext)

{

if (value != null)

{

var valueAsString = value.ToString();

if (valueAsString.Split(' ').Length > _maxWords)

{

var errorMessage = FormatErrorMessage(

validationContext.DisplayName);

return new ValidationResult(errorMessage);

}

}

return ValidationResult.Success;

}

}

2、让数据类型实现IValidatableObject接口

 

public class Person: IValidatableObject
 {
     [DisplayName("姓名")]
     public string Name { get; set; }
  
     [DisplayName("性别")]
     public string Gender { get; set; }
  
     [DisplayName("年龄")]
     public int? Age { get; set; }
  
     public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        Person person = validationContext.ObjectInstance as Person;
        if (null == person)
        {
            yield break;
        }
        if(string.IsNullOrEmpty(person.Name))
        {
            yield return new ValidationResult("'Name'是必需字段", new string[]{"Name"});
        }
 
        if (string.IsNullOrEmpty(person.Gender))
        {
            yield return new ValidationResult("'Gender'是必需字段", new string[] { "Gender" });
        }
        else if (!new string[]{"M","F"}.Any(g=>string.Compare(person.Gender,g, true) == 0))
         {
             yield return new ValidationResult("有效'Gender'必须是'M','F'之一", new string[] { "Gender" });
          }
   
          if (null == person.Age)
      {
          yield return new ValidationResult("'Age'是必需字段", new string[] { "Age" });
      }
      else if (person.Age > 25 || person.Age < 18)
      {
          yield return new ValidationResult("'Age'必须在18到25周岁之间", new string[] { "Age" });
         }            
     }
 }

3、让数据类型实现IDataErrorInfo接口

上面我们让数据类型实现IValidatableObject接口并将具体的验证逻辑定义在实现的Validate方法中,这样的类型能够被ASP.NET MVC所识别,后者会自动调用该方法对绑定的数据对象实施验证。如果我们让数据类型实现IDataErrorInfo接口也能实现类似的自动化验证效果。

同样是针对上面演示的实例,现在我们对需要被验证的数据类型Person进行了重新定义。如下面的代码片断所示,我们让Person实现了IDataErrorInfo接口。在实现的索引中,我们将索引参数columnName视为属性名称,根据它按照上面的规则对相应的属性成员实施验证,并在验证失败的情况下返回相应的错误消息。

public class Person : IDataErrorInfo
{
    [DisplayName("姓名")]
    public string Name { get; set; }
 
    [DisplayName("性别")]
    public string Gender { get; set; }
 
    [DisplayName("年龄")]
    public int? Age { get; set; }
 
    [ScaffoldColumn(false)]
    public string Error { get; private set; }
 
    public string this[string columnName]
    {
        get 
        {
            switch (columnName)
            {
                case "Name":
                    { 
                        if(string.IsNullOrEmpty(this.Name))
                        {
                            return "'姓名'是必需字段";
                        }
                        return null;
                    }
                case "Gender":
                    {
                        if (string.IsNullOrEmpty(this.Gender))
                        {
                            return "'性别'是必需字段";
                        }
                        else if (!new string[] { "M", "F" }.Any(g => string.Compare(this.Gender, g, true) == 0))
                        {
                            return "'性别'必须是'M','F'之一";
                        }
                        return null;
                    }
                case "Age":
                    {
                        if (null == this.Age)
                        {
                            return "'年龄'是必需字段";
                        }
                        else if (this.Age > 25 || this.Age < 18)
                        {
                            return "'年龄'必须在18到25周岁之间";
                        }
                        return null;
                    }
                default: return null;
                        
            }
        }
    }
}

Mvc数据验证总结的更多相关文章

  1. MVC 数据验证

    MVC 数据验证 前一篇说了MVC数据验证的例子,这次来详细说说各种各样的验证注解.System.ComponentModel.DataAnnotations 一.基础特性 一.Required 必填 ...

  2. MVC 数据验证[转]

    前一篇说了MVC数据验证的例子,这次来详细说说各种各样的验证注解. 一.基础特性 一.Required 必填选项,当提交的表单缺少该值就引发验证错误. 二.StringLength 指定允许的长度 指 ...

  3. MVC 数据验证【转】

    [转自]http://www.cnblogs.com/dozer/archive/2010/04/12/MVC-DataAnnotations.html 作者Dozer 今天在这里给大家介绍一下MVC ...

  4. mvc 数据验证金钱格式decimal格式验证

    mvc 数据验证金钱格式decimal格式验证 首先看下代码 /// <summary> /// 产品单价 /// </summary> [Display(Name = &qu ...

  5. MVC数据验证

    深入浅出 MVC 数据验证 2.0 [附演示源码] 今天在这里给大家介绍一下MVC的数据验证框架. 在1.0版中,很多朋友提出了怎么使用客户端验证,今天找了一些资料,发现了客户端验证的方法. 1.MV ...

  6. MVC数据验证使用小结

    原文:MVC数据验证使用小结 描述:MVC数据验证使用小结 内容:display,Required,stringLength,Remote,compare,RegularExpression 本人最近 ...

  7. Hibernate Validation,Spring mvc 数据验证框架注解

    1.@NotNull:不能为 Null,但是可以为Empty:用在基本数据类型上. @NotNull(message="{state.notnull.valid}", groups ...

  8. MVC数据验证原理及自定义ModelValidatorProvider实现无编译修改验证规则和错误信息

    Asp.net MVC中的提供非常简单易用的数据验证解决方案. 通过System.ComponentModel.DataAnnotations提供的很多的验证规则(Required, StringLe ...

  9. 【转】ASP.NET MVC 数据验证及相关内容

    原文地址:http://www.jb51.net/article/56713.htm 一.数据验证 数据验证的步骤在模型类中添加与验证相关的特性标记在客户端导入与验证相关的js文件和css文件使用与验 ...

  10. Spring MVC 数据验证——validate注解方式

    1.说明 学习注解方式之前,应该先学习一下编码方式的spring注入.这样便于理解验证框架的工作原理.在出错的时候,也能更好的解决这个问题.所以本次博客教程也是基于编码方式.仅仅是在原来的基础加上注解 ...

随机推荐

  1. 虚幻引擎UE4如何制作可拖动(Drag and Drop)的背包(Scrollbox)

    本教程适合初学者(学习经历已有30天的UE4初学者). 最终效果 由于隐私保护,不想截实际的效果图,下面给出了示意图,左边是背包A,右边是背包B,将其中的子项目从左侧拖往右侧的背包,然后在插入位置放置 ...

  2. Python的元类

    1.用元类验证子类 每当我们定义新类的时候,元类就会运行雅正代码,以确保这个新类符合规定的规范. Python系统把子类的class语句处理完毕,就会调用元类的 __new__ 方法.元类可以通过 _ ...

  3. 关于Mongo的一些坑

    和大多数人一样,从Mysql转到Mongo的过程中,思维上经历了很大的转变.下面来说几点我遇到的坑: 1.单文档16M 这个是最多人碰到的,我也碰到过,当然,幸好是因为操作有误,导致这种不正常的大量数 ...

  4. SQl去获取相同记录

    以name字段为例 select * from table where name in(select name from table group by name having count(name)& ...

  5. JS操作字符串常用的方法

    JS操作String对象的方法 charAt(index):返回指定索引处的字符串charCodeAt(index):返回指定索引处的字符的Unicode的值concat(str1,str2,...) ...

  6. 【tomcat8】consider increasing the maximum size of the cache

    [/WEB-INF/classes/hudson/model/Messages_zh_CN.properties] to the cache for web application [/jenkins ...

  7. Verilog HDL的程序结构及其描述

    这篇博文是写给要入门Verilog HDL及其初学者的,也算是我对Verilog  HDL学习的一个总结,主要是Verilog HDL的程序结构及其描述,如果有错,欢迎评论指出. 一.Verilog ...

  8. Windows查看端口使用状况

    使用端口是我们在进行远程或者打印机等都会遇到的,但是有很多用户会遇到端口被占用的情况,遇到这样的问题首先就要找出电脑中的所以端口然后进行查看,还是有很多人不知道该如何查看电脑端口. 1 查看windo ...

  9. android studio生成junitLibs

    apply plugin: 'com.android.application'android { compileSdkVersion 24 buildToolsVersion "25.0.0 ...

  10. Unity Shader入门精要读书笔记(一)序章

    本系列的博文是笔者读<Unity Shader入门精要>的读书笔记,这本书的章节框架是: 第一章:着手准备. 第二章:GPU流水线. 第三章:Shader基本语法. 第四章:Shader数 ...