首页 技术 正文
技术 2022年11月7日
0 收藏 846 点赞 708 浏览 6508 个字

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

Mvc数据验证总结开启客户端验证

Mvc数据验证总结使用Unobtrusive,行动与表现分离

老版本

Mvc数据验证总结

Mvc数据验证总结

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; }

Mvc数据验证总结

Mvc数据验证总结

Mvc数据验证总结

Mvc数据验证总结

常用正则:

数字:”^[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;
                        
            }
        }
    }
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,020
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,513
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,359
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,142
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,772
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,850