Validate dữ liệu và Kiểu Dữ Liệu trong code first

Làm thế nào để sử dụng các attributes

Tất cả các thuộc tính được viết ngay trước property/class/function với số 0 hoặc nhiều tham số bắt buộc theo sau bởi một danh sách các thông số được đặt tên tùy chọn. Các thuộc tính StringLength, ví dụ, có một tham số bắt buộc: MaximumLength

 [StringLength(10)]
public string MembershipCode { get; set; }

... Nhưng cũng có thể đính kèm các thông số như tên MinimumLength và ErrorMessage. Khi sử dụng Visual Studio bạn đang được cung cấp một danh sách của tất cả các thông số được đặt tên có sẵn.

[StringLength(20, MinimumLength = 5, ErrorMessage = "Use 5-20 characters")]
public string UserName { get; set; }
[Required]
public string CountryCode { get; set; }

Làm thế nào MVC sử dụng để validate biến đến (incoming variable)

Các đối tượng ModelState chứa thông tin về tất cả các thông số đầu vào. Trong ví dụ dưới đây biến đến là các đối tượng Customer. Nếu các đối tượng Customer xác định rằng CountryCode là Required nhưng không có CountryCode được liệt kê trong số các biến đến, ModelState sẽ đánh dấu một sự thất bại xác nhận và người dùng sẽ được chuyển hướng trở lại trang với một thông báo lỗi. Xác nhận điều này được thực hiện tự động cho bạn và cho thấy một ví dụ về cách hữu các thuộc tính có thể được.

 [HttpPost]
public ActionResult Edit(Customer customer)
{
    if (ModelState.IsValid) {
        // Save customer
        return RedirectToAction("Index");
    } else {
        return View();
    }
}

Ràng buộc dữ liệu đối với các attributes

Ở đây sau một danh sách các validation phổ biến nhất các thuộc tính có sẵn khi xây dựng một mô hình code-first. ** Compare** So sánh giá trị của một property đối với property khác. Các property Compare tồn tại trong cả System.Web.Mvc và System.Component.DataAnnotations Ví dụ dưới đây làm cho chắc chắn rằng các đặc tính Email và EmailVerify đều giống nhau.

public class RegisterEmailAddressViewModel
{
    [Required]
    public int UserId { get; set; }

    [DataType(DataType.EmailAddress)]
    public string Email { get; set; }

    [System.ComponentModel.DataAnnotations.Compare("Email",
        ErrorMessage = "Verify email is invalid")]
    public string EmailVerify { get; set; }
}

Xin lưu ý rằng ví dụ trên không có ý định cho việc lưu trữ cơ sở dữ liệu. Nếu bạn sử dụng thuộc tính so sánh trong một lớp mô hình cơ sở dữ liệu có thể bạn cũng có thể [NotMapped] thuộc tính vì bạn ko muốn lưu email 2 lần

CreditCard

public class Transaction
{
    public int TransactionId { get; set; }
    public decimal Amount { get; set; }

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

**CustomValidation ** Khi bạn muốn viết validation của riêng bạn. Đơn giản chỉ cần tạo ra một lớp thực hiện các lớp ValidationAttribute. Thêm một chức năng public static mà chấp nhận một giá trị được so sánh và trả về một thể hiện của ValidationResult.

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class OldEnoughValidationAttribute : ValidationAttribute
{
    public static ValidationResult IsOldEnough(int givenAge)
    {
        if (givenAge >= 20)
            return ValidationResult.Success;
        else
            return new ValidationResult("You're not old enough");
    }
}

Sử dụng nó như sau

public class Customer
{
    [CustomValidation(typeof(OldEnoughValidationAttribute), "IsOldEnough")]
    public int Age { get; set;
}

Một cách khác để tạo và sử dụng các custom validation, thay vì tạo ra các public static , để ghi đè lên các chức năng IsValid hiện trong lớp ValidationAttribute. Override chức năng IsValid

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class OldEnoughValidationAttribute : ValidationAttribute
{
    public int LimitAge { get; set; }
    public OldEnoughValidationAttribute(int limitAge)
    {
        LimitAge = limitAge;
    }
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        int val = (int)value;

        if (val >= LimitAge)
            return ValidationResult.Success;
        else
            return new ValidationResult(ErrorMessageString);
    }
}

**Dùng nó như sau **

public class Customer
{
    [OldEnoughValidation(20, ErrorMessage = "You're not old enough")]
    public int Age { get; set;
}

Kiểu dữ liệu (DataType)

Cho phép bạn chỉ định một kiểu dữ liệu mà cụ thể hơn các chỉ định trong database.Điều này có thể được sử dụng để cung cấp validation chính xác hơn và hiển thị thích hợp cho người sử dụng. Kiểu dữ liệu hợp lệ là:

  • CreditCard
  • Currency
  • Custom
  • Date – date value
  • DateTime – date and time value
  • Duration
  • EmailAddress
  • Html – specify that Html code is expected
  • ImageUrl – url to an image
  • MultilineText – uses textarea instead of text as input type in forms.
  • Password
  • PhoneNumber
  • PostalCode
  • Text
  • Time
  • Upload – a file upload data type
  • Url

** Sử dụng như sau **

 public class Customer
{
    [DataType(DataType.EmailAddress, ErrorMessage = "Not a valid email address")]
    public string Email { get; set; }
}

Display

Trưng bày text label cho properties

public class Customer
{
    [Display(Name = "Email is confirmed")]
    public bool EmailIsConfirmed { get; set; }
}

DisplayFormat

Chỉ định format dữ liệu

public class Post
{
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy HH:mm}")]
    public DateTime PostedDate { get; set; }

    // Display as currency
    [DisplayFormat(DataFormatString="{0:C}")]
    public object WritingCost;

    // Store NULL as NULL but show as empty string
    [DisplayFormat(ConvertEmptyStringToNull = true, NullDisplayText = "")]
    public string ExtraDescription { get; set; }
}

EmailAddress

Format địa chỉ email

public class Customer
{
    [EmailAddress(ErrorMessage="You have to enter a valid email address")]
    public string EmailAddress { get; set; }
}

EnumDataType

Dùng để map một giá trị với một chuỗi có nghĩa (key-value)

public class Line
{
    [EnumDataType(typeof(IntColor))]
    public object LineColor { get; set; }
}
public enum IntColor
{
    Red = 1,
    Blue = 2,
    Green = 3,
    [Description("Slimy yellow")]
    Yellow = 4
}

FileExtensions

Chỉ định extension cho một file

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    [FileExtensions(Extensions="jpg,jpeg")]
    public string Avatar { get; set; }
}

Nếu png sẽ có lỗi như sau :

alt

MembershipPassword

public class Customer
{
    [Required]
    public string UserName { get; set; }

    [MembershipPassword(
        MinRequiredPasswordLength=8,
        ErrorMessage="Your password needs to be at least 8 characters long",
        MinRequiredNonAlphanumericCharacters=1,
        MinNonAlphanumericCharactersError="At least one of the characters needs to be non-alphanumeric")]
    public string Password { get; set; }
}

Phone

public class CustomerPhone
{
    public int Id { get; set; }
    [Phone]
    public string PhoneNumber { get; set; }
}

Range

Chỉ định một phạm vi giữa số min và số max

public class Customer
{
    [Range(0, 120, ErrorMessage = "Age has to be between {1} and {2}")]
    public int Age { get; set; }
}

RegularExpression

public class Customer
{
    [RegularExpression(@"^[A-Z]{2}$",
        ErrorMessage = "Country code can only be two alphabetic characters in CAPITALS")]
    public string CountryCode { get; set; }
}

**Url**

```Language

public class WebLink
{
    public int Id { get; set; }
    [Url]
    public string Url{ get; set; }
    public string Description { get;set; }
}