Merhaba,
Client arayüzünden gelen model,dto veya viewmodel her ne diyorsak,property lerinin belli bir kalıp içinde gelmesini istiyor olabiliriz. email formatında gelsin,11 karakterli gelsin, maks 50 olsun min 5 olsun, ya da 1-100 arasındaki değerlere göre gelsin gibiii.. Ne oluyorsa olsun kesin gelsin (Required) gibi gibi. Bunları data annotation içerisinde hazır attribute lerle sağlayabiliyoruz.
Biz bugün bir tane custom bir tane de remote attribute için örnek üzerine olacak şekilde bir demo yapacağız…
Senaryoya ait class ın Name property si için kıstaslar şunlar;

1-) Custom Validation Attribute
İlk olarak TariffNameContainsCheck isimli attirbute class ını ele alıyoruz.
ValidationAttribute class ının inherit edilmesi gerekiyor.

(ctrl + .) kombinasyonu ile açılan menüden generate overrides dediğimizde;
ValidationContext argümanı ile çalışan methodu override ediyoruz.

bu adımdan sonra nasıl kontrol etmek istediğimizi kendimiz belirleyebiliriz
hata mesajları için “return new ValidationResult(errorMessage);” olarak döndürülürken. herşey ok ise return ValidationResult.Success; ile dönüş sağlanır. yukarıdaki örnekte, property e yazılan value değerini static const class ımdaki değerlerle karşılaştırıp,içeriyorsa valid değilse invalid şeklinde dönmesi sağlanıyor.
int checkEqual = 0;
if (value != null)
{
var fields = typeof(StaticConstTypes).GetFields(BindingFlags.Static | BindingFlags.Public);
foreach (FieldInfo field in fields)
{
string val = field.GetRawConstantValue().ToString();
if (!string.IsNullOrEmpty(val) && value.ToString().Contains(val.ToUpper()))
{
checkEqual++;
}
}
if (checkEqual == 0)
{
ErrorMessage = string.Format("{0} is not contains static const type name", value);
var errorMessage = FormatErrorMessage($"{ErrorMessage} - {validationContext.DisplayName}");
return new ValidationResult(errorMessage);
}
}
else
{
var errorMessage = FormatErrorMessage((validationContext.DisplayName));
return new ValidationResult(errorMessage);
}
return ValidationResult.Success;
2-) Remote Validation Attribute
Remote attribute ü aldığı ilk parametre ile method u,ikinci parametre ile de controller ı refer eder. yukarıdaki örneğimizde Tariff controllerında TariffNameExistCheck isimli methoda erişeceğini belirtiyor.

burada dikkat edilmesi gereken kısım methodun aldığı argüman ile ilgili, argümanın ismi ile class property ismi aynı olmalıdır. Burada örnekler çoğaltılabilir ama methodumdaki örnekte , aynı isimle 2.ci bir kayıt atılmaması için bir kontrol mekanızması kurulmuş oldu.
İlk data annotation için uyarı görseli;

İkinci data annotation için uyarı görseli;

……