PDA

View Full Version : سوال: RegularExpression , AllowEmptyStrings کد ملی



Iran58
پنج شنبه 02 آذر 1396, 09:41 صبح
سلام
من فیلد زیر را تعریف کرده ام
public string NationalId { get; set; }

حال می خواهم
که حتما عدد باشه(بهتر قانون کدملی را هم چک کند)و همجنین 10 عدد باشد یا خالی باشد
چگونه باید DataAnnotations برایش تعریف کنم باتشکر

mr.sirwan
پنج شنبه 02 آذر 1396, 11:24 صبح
باید یه کلاس تعریف کنین که از کلاس ValidationAttribute ارث بری داشته باشه و به این صورت کدهارو بنویسین:

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class NationalCodeAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
if (value == null)
return false;

return IsValidNationalCode(value.ToString());
}

public bool IsValidNationalCode(string nationalCode)
{
//در صورتی که کد ملی وارد شده تهی باشد
if (String.IsNullOrEmpty(nationalCode))
return false;

//در صورتی که کد ملی وارد شده طولش کمتر از 10 رقم باشد
if (nationalCode.Length != 10)
return false;

//در صورتی که کد ملی ده رقم عددی نباشد
var regex = new Regex(@"\d{10}");
if (!regex.IsMatch(nationalCode))
return false;
//throw new Exception("کد ملی تشکیل شده از ده رقم عددی می‌باشد؛ لطفا کد ملی را صحیح وارد نمایید");

//در صورتی که رقم‌های کد ملی وارد شده یکسان باشد
var allDigitEqual = new[] { "0000000000", "1111111111", "2222222222", "3333333333", "4444444444", "5555555555", "6666666666", "7777777777", "8888888888", "9999999999" };
if (allDigitEqual.Contains(nationalCode))
return false;

var chArray = nationalCode.ToCharArray();
var num0 = Convert.ToInt32(chArray[0].ToString()) * 10;
var num2 = Convert.ToInt32(chArray[1].ToString()) * 9;
var num3 = Convert.ToInt32(chArray[2].ToString()) * 8;
var num4 = Convert.ToInt32(chArray[3].ToString()) * 7;
var num5 = Convert.ToInt32(chArray[4].ToString()) * 6;
var num6 = Convert.ToInt32(chArray[5].ToString()) * 5;
var num7 = Convert.ToInt32(chArray[6].ToString()) * 4;
var num8 = Convert.ToInt32(chArray[7].ToString()) * 3;
var num9 = Convert.ToInt32(chArray[8].ToString()) * 2;
var a = Convert.ToInt32(chArray[9].ToString());

var b = (((((((num0 + num2) + num3) + num4) + num5) + num6) + num7) + num8) + num9;
var c = b % 11;

return (((c < 2) && (a == c)) || ((c >= 2) && ((11 - c) == a)));
}
}