DataAnnotations

Integrate Validixty validation with ASP.NET Core model validation using DataAnnotations attributes.

What are DataAnnotations?

DataAnnotations in Validixty provide attribute-based validation that integrates seamlessly with ASP.NET Core's model validation system. Simply decorate your model properties with validation attributes, and Validixty handles the rest automatically.

Why Use DataAnnotations?

  • Declarative: Define validation rules using attributes
  • ASP.NET Integration: Works with MVC model binding and validation
  • Clean Code: Separate validation logic from business logic
  • Automatic Validation: No manual validation calls needed

Before Using Validixty

Without Validixty, DataAnnotations validation might require custom attributes:

using System.ComponentModel.DataAnnotations;

public class UserModel
{
    [Required(ErrorMessage = "Email is required")]
    [EmailAddress(ErrorMessage = "Invalid email format")]
    public string Email { get; set; }

    [Required(ErrorMessage = "Phone is required")]
    [RegularExpression("^(\\+20|0)?1[0-2,5]\\d{8}$", ErrorMessage = "Invalid Egyptian phone number")]
    public string PhoneNumber { get; set; }

    [Required(ErrorMessage = "Credit card is required")]
    [RegularExpression("^\\d{13,19}$", ErrorMessage = "Invalid credit card format")]
    public string CreditCardNumber { get; set; }

    [Required(ErrorMessage = "IBAN is required")]
    [StringLength(34, MinimumLength = 15, ErrorMessage = "IBAN must be between 15-34 characters")]
    public string IBAN { get; set; }
}

// Custom validation attribute
public class EgyptianPhoneAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value == null) return ValidationResult.Success;

        var phone = value.ToString();
        if (string.IsNullOrEmpty(phone)) return ValidationResult.Success;

        var pattern = "^(\\+20|0)?1[0-2,5]\\d{8}$";
        if (!Regex.IsMatch(phone, pattern))
        {
            return new ValidationResult("Invalid Egyptian phone number format");
        }

        return ValidationResult.Success;
    }
}

After Using Validixty

With Validixty's DataAnnotations, validation becomes much simpler:

using Validixty.Annotations;

public class UserModel
{
    [Phone(Country = CountriesEnum.Egypt)]
    public string PhoneNumber { get; set; }

    [NationalID(Country = CountriesEnum.SaudiArabia)]
    public string NationalId { get; set; }

    [CreditCard(Type = CardTypes.Visa)]
    public string CreditCardNumber { get; set; }

    [SmartValidate]
    public string IBAN { get; set; }
}

How It Saves Time

  • Eliminates custom attributes: Pre-built validation attributes
  • Country-specific validation: Built-in international formats
  • Automatic integration: Works with ASP.NET Core out of the box
  • Consistent validation: Same rules across your application

Usage Examples

User Registration Model

using Validixty.Annotations;

public class RegisterViewModel
{
    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Phone(Country = CountriesEnum.Egypt)]
    public string PhoneNumber { get; set; }

    [CreditCard]
    public string CreditCardNumber { get; set; }

    [Required]
    [StringLength(100, MinimumLength = 8)]
    public string Password { get; set; }
}

Controller Integration

public class AccountController : Controller
{
    [HttpPost]
    public IActionResult Register(RegisterViewModel model)
    {
        if (!ModelState.IsValid)
        {
            // Validation errors are automatically added to ModelState
            return View(model);
        }

        // Model is valid, proceed with registration
        return RedirectToAction("Success");
    }
}

Payment Model

public class PaymentModel
{
    [CreditCard(Type = CardTypes.MasterCard)]
    public string CardNumber { get; set; }

    [Required]
    [Range(0.01, 10000.00)]
    public decimal Amount { get; set; }

    [StringLength(3, MinimumLength = 3)]
    public string Currency { get; set; }

    [SmartValidate] // Auto-detects IBAN format
    public string BankAccount { get; set; }
}

Address Model

public class AddressModel
{
    [Required]
    [StringLength(200)]
    public string StreetAddress { get; set; }

    [Required]
    [StringLength(100)]
    public string City { get; set; }

    [PostalCode(Country = CountriesEnum.Egypt)]
    public string PostalCode { get; set; }

    [Coordinates]
    public string Latitude { get; set; }

    [Coordinates]
    public string Longitude { get; set; }
}

Document Upload Model

public class DocumentModel
{
    [Required]
    [StringLength(255)]
    public string FileName { get; set; }

    [FileExtension(AllowedExtensions = new[] { ".pdf", ".doc", ".docx" })]
    public string Extension { get; set; }

    [MimeType(AllowedTypes = new[] { "application/pdf", "application/msword" })]
    public string ContentType { get; set; }

    [Required]
    public long FileSize { get; set; }
}