如何在 asp.net 核心中为伊朗国家代码创建自定义验证属性?
How to create custom validation attribute for Iranian national code in asp.net core?
我正在尝试验证 asp.net 核心中的国家代码。我找到了验证码,当我将它用作方法时它可以工作,但我想创建它作为验证 attribute.This 是我在属性 class:
中的代码
public class ValidateNationalCodeAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
string nationalCode = value.ToString();
var isValid = true;
char[] chArray = nationalCode.ToCharArray();
int[] numArray = new int[chArray.Length];
for (int i = 0; i < chArray.Length; i++)
{
numArray[i] = (int)char.GetNumericValue(chArray[i]);
}
int num2 = numArray[9];
int num3 = ((((((((numArray[0] * 10) + (numArray[1] * 9)) + (numArray[2] * 8)) + (numArray[3]
* 7)) + (numArray[4] * 6)) + (numArray[5] * 5)) + (numArray[6] * 4)) + (numArray[7] * 3)) +
(numArray[8] * 2);
int num4 = num3 - ((num3 / 11) * 11);
if ((((num4 == 0) && (num2 == num4)) || ((num4 == 1) && (num2 == 1))) || ((num4 > 1) && (num2
== Math.Abs((int)(num4 - 11)))))
{
isValid = true;
}
else
{
isValid = false;
}
switch (nationalCode)
{
case "0000000000":
case "1111111111":
case "22222222222":
case "33333333333":
case "4444444444":
case "5555555555":
case "6666666666":
case "7777777777":
case "8888888888":
case "9999999999":
isValid = false;
break;
}
if (!isValid)
{
return new ValidationResult("invalid");
}
return ValidationResult.Success;
}
}
我就是这样用的。它在 viewModel class:
中
[ValidateNationalCode]
public string NationalCode { get; set; }
我 运行 应用程序,例如我输入 1111111111 作为国家代码,但它没有显示任何错误。我该怎么办?
编辑:
这是观点:
<div class="col-md-4 form-group">
<label asp-for="NationalCode" class="required"></label>
<input class="form-control text-box single-line valid"
asp-for="NationalCode">
<span asp-validation-for="NationalCode" class="text-
danger"></span>
</div>
这是控制器:
[HttpPost("{id}")]
public async Task<IActionResult> installment(long id, NewInstallmentGVM
model)
{
if (ModelState.IsValid)
{
var Result = await
_installmentService.AddInstallmentFromPayment(id, model);
if (Result.Succeeded)
{
return View("InstallmentSucceeded",Result.Value);
}
else
{
return View("InvalidInstallment");
}
}
return View(model);
}
据我所知,客户端验证与服务器验证不同。我猜您想在客户端显示错误消息。但这不是一回事。
Asp.net核心不支持在客户端显示客户属性验证错误消息。
如果你想这样做,你应该自己写。
更详细的可以参考这个article.
我正在尝试验证 asp.net 核心中的国家代码。我找到了验证码,当我将它用作方法时它可以工作,但我想创建它作为验证 attribute.This 是我在属性 class:
中的代码public class ValidateNationalCodeAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
string nationalCode = value.ToString();
var isValid = true;
char[] chArray = nationalCode.ToCharArray();
int[] numArray = new int[chArray.Length];
for (int i = 0; i < chArray.Length; i++)
{
numArray[i] = (int)char.GetNumericValue(chArray[i]);
}
int num2 = numArray[9];
int num3 = ((((((((numArray[0] * 10) + (numArray[1] * 9)) + (numArray[2] * 8)) + (numArray[3]
* 7)) + (numArray[4] * 6)) + (numArray[5] * 5)) + (numArray[6] * 4)) + (numArray[7] * 3)) +
(numArray[8] * 2);
int num4 = num3 - ((num3 / 11) * 11);
if ((((num4 == 0) && (num2 == num4)) || ((num4 == 1) && (num2 == 1))) || ((num4 > 1) && (num2
== Math.Abs((int)(num4 - 11)))))
{
isValid = true;
}
else
{
isValid = false;
}
switch (nationalCode)
{
case "0000000000":
case "1111111111":
case "22222222222":
case "33333333333":
case "4444444444":
case "5555555555":
case "6666666666":
case "7777777777":
case "8888888888":
case "9999999999":
isValid = false;
break;
}
if (!isValid)
{
return new ValidationResult("invalid");
}
return ValidationResult.Success;
}
}
我就是这样用的。它在 viewModel class:
中 [ValidateNationalCode]
public string NationalCode { get; set; }
我 运行 应用程序,例如我输入 1111111111 作为国家代码,但它没有显示任何错误。我该怎么办?
编辑: 这是观点:
<div class="col-md-4 form-group">
<label asp-for="NationalCode" class="required"></label>
<input class="form-control text-box single-line valid"
asp-for="NationalCode">
<span asp-validation-for="NationalCode" class="text-
danger"></span>
</div>
这是控制器:
[HttpPost("{id}")]
public async Task<IActionResult> installment(long id, NewInstallmentGVM
model)
{
if (ModelState.IsValid)
{
var Result = await
_installmentService.AddInstallmentFromPayment(id, model);
if (Result.Succeeded)
{
return View("InstallmentSucceeded",Result.Value);
}
else
{
return View("InvalidInstallment");
}
}
return View(model);
}
据我所知,客户端验证与服务器验证不同。我猜您想在客户端显示错误消息。但这不是一回事。
Asp.net核心不支持在客户端显示客户属性验证错误消息。
如果你想这样做,你应该自己写。
更详细的可以参考这个article.