برای تعریف یک اعتبارسنجی مورد نظر خود، باید ابتدا با کلاس ValidationAttribute آشنا شویم، این کلاس چند متد و ویژگی دارد که برای اعتبارسنجی دادهها به کار میرود. یکی از متدهای اصلی این کلاس متد IsValid است. این متد 2 بازنویسی دارد که به صورت زیر هستند:
public virtual bool IsValid(object value);
protected virtual ValidationResult IsValid(object value, ValidationContext validationContext);
ابتدا بازنویسی اول را بررسی میکنیم. فرض کنید کلاسی به صورت زیر داریم:
public class CustomValidation : ValidationAttribute {
public override bool IsValid(object value) {
var strValue = value.ToString();
return strValue.StartsWith(«Msd»); } }
این اعتبارسنجی مشخص میکند اگر مقدار فیلدی که آن را اعتبارسنجی میکنید با Msd شروع نشده باشد معتبر نیست و false را برمیگرداند. اگر این متد false را برگرداند، این کلاس خود پیغامهای خطایی است که شما به عنوان پارامتر برای صفت مشخص کننده اعتبارسنجی تنظیم کردهاید (در شماره قبلی با نحوه نمایش پیغامها آشنا شدهایم).
نحوه استفاده از این صفت برای اعتبارسنجی به صورت زیر است:
[CustomValidation(ErrorMessage = “Value must start with \”Mdf\””)]
Public string CompanyName { get; set; }
قدری مثال را تغییر میدهیم، فرض کنیم مقدار CompanyName باید وارد شده باشد، اگر وارد نشده باشد نیز پیغام خطا بدهد. برای این کار چه تدبیری باید اندیشید؟
2 راه پیشروی شماست؛ راه اول این است که خالی بودن مقدار CompanyName را در متد IsValid به همراه شرط شروع با Msd بررسی کنید که کد بالا باید به این شکل بازنویسی شود:
public override bool IsValid(object value) {
if (value == null) {
ErrorMessage = «The value must be entered»; return false; }
var strValue = value.ToString();
return strValue.StartsWith(«Msd»); }
راه دیگر ارث بری از کلاس RequiredAttribute و بازنویسی متد IsValid است که کد آن به شیوه زیر نوشته میشود:
public class CustomValidation : RequiredAttribute {
public override bool IsValid(object value) {
if (base.IsValid(value)) {
var strValue = value.ToString();
return strValue.StartsWith(«Msd»); }
ErrorMessage = «The companyname must entered»;
return false; } }
اما باز هم این روش نیاز به نوشتن کد اضافی دارد!
بسیار خب حالا ما یک صفت اعتبارسنجی را سفارشی کردیم، حال میخواهیم کلا یک کلاس مدل را اعتبارسنجی کنیم.
public override bool IsValid(object value) {
var customer = value as Models.Customer;
if (customer != null) {
if (customer.CompanyName == null || customer.CompanyName == string.Empty) {
ErrorMessage = «The company name must be entered»;
return false; }
if (!customer.CompanyName.StartsWith(«Msd»)) {
ErrorMessage = «Company name must start with \»Msd\»»;
return false; }
} else {
ErrorMessage = «Customer must be have a value»;
return false; }
return false; }
کد بالا نشاندهنده صفت مشخص برای اعتبارسنجی یک شیء Customer است، اما یک نکته دارد و آن هم بررسی null بودن شیء customer است. در حالت عادی یعنی زمانی که شما با فرم وب کار میکنید، مقدار customer برابر null نمیشود، ولی ممکن است دادههای ورودی توسط درخواستی که برای Customer/Create میآید Null باشد و برای همین بهتر است مقدار null بودن آن را بررسی کنیم.
تا اینجای بحث توانستیم یک اعتبارسنجی سفارشی را بنویسیم، اما یک راه حل برای نوشتن اعتبارسنجی این است که یک مدل، خودش را اعتبارسنجی کند. برای این کار کافی است شیء مدل رابط IValidateObject را پیادهسازی کند. با این روش، شما دیگر نیازی به تعیین صفت برای اعتبارسنجی مدل خود ندارید. برای آشنایی بیشتر با این رابط، به لینک یک مراجعه کنید. پیادهسازی این رابط به عهده خواننده است.
امیربهاالدین سبطالشیخ