نحوه اعتبارسنجی (Validation) در Complex Type‌ ها و Nested Object‌ ها در Blazor

در پروژه‌های Blazor، زمانی که از DataAnnotationsValidation برای کنترل اعتبار ورودی‌های فرم استفاده می‌کنیم، معمولاً همه‌چیز به‌خوبی برای تایپ‌های ساده مثل string، int یا bool کار می‌کند. اما زمانی که در مدل‌مان از Complex Type یا Nested Object استفاده کنیم، ممکن است متوجه شویم که ولیدیشن (Validation) برای آن‌ها به‌درستی عمل نمی‌کند — حتی اگر اتریبیوت‌های لازم را روی پراپرتی‌هایشان تعریف کرده باشیم. در این مقاله به‌صورت کامل بررسی می‌کنیم که چرا این اتفاق می‌افتد، و چطور می‌توانیم آن را در نسخه‌های مختلف .NET (از 9 تا 10) برطرف کنیم.


چرا ولیدیشن روی Complex Type‌ها کار نمی‌کند؟

به‌صورت پیش‌فرض، Blazor فقط ولیدیشن را روی پراپرتی‌های سطح اول مدل بررسی می‌کند.
وقتی یکی از پراپرتی‌ها خودش یک آبجکت دیگر باشد (مثلاً یک کلاس با فیلدهای جداگانه)، Blazor به شکل پیش‌فرض وارد آن آبجکت نمی‌شود تا پراپرتی‌های داخلی‌اش را بررسی کند.

به همین دلیل، اگر مدل شما مثلاً به شکل زیر باشد:

public class LoanFormModel
{
    public string Name { get; set; }

    [ValidateComplexType]
    public LoanDetails Details { get; set; }
}

public class LoanDetails
{
    [Required]
    public decimal? Amount { get; set; }

    [Required]
    public LoanType? Type { get; set; }
}

ممکن است ولیدیشن برای Amount و Type اجرا نشود — مگر اینکه به‌صورت خاص Blazor را برای اعتبارسنجی تو در تو پیکربندی کنید.


راه‌حل در .NET 9 و نسخه‌های قبل

در نسخه‌های قبل از .NET 10، برای فعال کردن ولیدیشن در آبجکت‌های تو در تو، باید از دو ابزار استفاده کنید:

  1. به‌جای <DataAnnotationsValidator /> از <ObjectGraphDataAnnotationsValidator />

    استفاده کنید.

  2. روی پراپرتی مربوطه در مدل، اتریبیوت زیر را اضافه کنید:

  3. [ValidateComplexType]
    public LoanDetails Details { get; set; }

این کار باعث می‌شود ولیدیشن به‌صورت درختی (Recursive) روی تمام لایه‌های مدل اعمال شود.

نکته مهم:
قابلیت <ObjectGraphDataAnnotationsValidator /> هنوز در حالت Preview است، بنابراین برای فعال کردن آن باید پکیج مربوطه را از NuGet نصب کنید و گزینه‌ی Include prerelease را فعال کنید تا پکیج نمایش داده شود.

اسم پکیج:

 Microsoft.AspNetCore.Components.DataAnnotations.Validation


راه‌حل در .NET 10

از نسخه .NET 10 به بعد، مایکروسافت این قابلیت را به‌صورت رسمی به Blazor اضافه کرده است.
یعنی دیگر نیازی به نصب پکیج اضافی یا استفاده از نسخه‌های آزمایشی ندارید.

برای فعال کردن این ویژگی در Blazor 10 فقط کافی است:

  1. روی کلاس والد، اتریبیوت زیر را اضافه کنید:

     
    [ValidatableType]
    public class LoanFormModel
    {
        public string Name { get; set; }
        public LoanDetails Details { get; set; }
    }
  2. سپس در فایل Program.cs، این خط را به تنظیمات سرویس‌ها اضافه کنید:

     
    builder.Services.AddValidation();

به همین سادگی، اعتبارسنجی به‌صورت خودکار در تمام آبجکت‌های تو در تو اعمال خواهد شد.