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("身份證號非法,校驗失敗!");}}}}