using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;using System.Text;namespace _SCscHero.Model.01CustomAttribute
{/// <summary>/// 身份证号验证/// </summary>publicclassIdentityCardAttribute:ValidationAttribute{/// <summary>/// 验证/// </summary>/// <param name="value">当前属性值</param>/// <param name="validationContext">上下文</param>/// <returns></returns>protectedoverrideValidationResultIsValid(objectvalue,ValidationContext validationContext){try{if(value.ToString().Length !=18){returnnewValidationResult("身份证号长度非18位!");}long n =0;if(long.TryParse(value.ToString().Remove(17),out n)==false|| n < Math.Pow(10,16)||long.TryParse(value.ToString().Replace('x','0').Replace('X','0'),out n)==false){returnnewValidationResult("身份证号长度非数字!");}string address ="11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";if(address.IndexOf(value.ToString().Remove(2))==-1){returnnewValidationResult("身份证号中头信息有误!(省份、区号)");}string birth =value.ToString().Substring(6,8).Insert(6,"-").Insert(4,"-");DateTime time =newDateTime();if(DateTime.TryParse(birth,out time)==false){returnnewValidationResult("身份证号中生日信息有误!");}string[] arrVarifyCode =("1,0,x,9,8,7,6,5,4,3,2").Split(',');string[] Wi =("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").Split(',');char[] Ai =value.ToString().Remove(17).ToCharArray();int sum =0;for(int i =0; i <17; i++){
sum +=int.Parse(Wi[i])*int.Parse(Ai[i].ToString());}int y =-1;
Math.DivRem(sum,11,out y);if(arrVarifyCode[y]!=value.ToString().Substring(17,1).ToLower()){returnnewValidationResult("身份证号中校验码信息有误!");}return ValidationResult.Success;}catch(Exception ex){returnnewValidationResult("身份证号非法,校验失败!");}}}}