Thuộc tính StringLạng so với MaxLạng ASP.NET MVC với Entity Framework EF Code Đầu tiên


152

Sự khác biệt trong hành vi [MaxLength][StringLength]thuộc tính là gì?

Theo như tôi có thể nói (với ngoại lệ [MaxLength]có thể xác nhận độ dài tối đa của một mảng) thì chúng có giống nhau và hơi dư thừa không?


1
Tôi không chắc chắn về ASP.NET MVC nhưng đối với EF thì không có gì khác biệt: stackoverflow.com/questions/5414611/ Lời
Ladislav Mrnka

1
ChuỗiLpm không ảnh hưởng đến kích thước col di chuyển khi bạn thay đổi nó.
Cas Bloem

@CasBloem StringLpm thực sự được chọn bởi EntityFramework và sẽ tác động đến độ dài cột - ít nhất là trong phiên bản 6.
jakejgordon 26/03/18

Câu trả lời:


203

MaxLpm được sử dụng cho Entity Framework để quyết định mức độ lớn để tạo trường giá trị chuỗi khi nó tạo cơ sở dữ liệu.

Từ MSDN:

Chỉ định độ dài tối đa của dữ liệu mảng hoặc chuỗi được phép trong một thuộc tính.

StringLpm là một chú thích dữ liệu sẽ được sử dụng để xác nhận đầu vào của người dùng.

Từ MSDN:

Chỉ định độ dài tối thiểu và tối đa của các ký tự được phép trong trường dữ liệu.


10
Cũng lưu ý rằng theo mặc định, MVC 3 không được nhận dạng MaxLengthAttribute, trong khi EF nhận raStringLengthAttribute
marcind

15
Vì vậy, thực sự không cần MaxLạng vì bạn có thể sử dụng StringLạng trong EF và nó cũng có kích thước trường chuỗi. Tại sao sau đó họ thậm chí còn tạo ra MaxLạng?
Matt Johnson-Pint

4
@MattJohnson - Tôi dường như nhớ lại rằng quyết định tạo thuộc tính MaxLạng mới là cho ngữ nghĩa vì StringLạng ngụ ý dữ liệu chuỗi nhưng cũng có thể áp dụng cho dữ liệu nhị phân. Nhưng nó chắc chắn là bất tiện.
Josh

1
@MartinSmith - Tôi vừa thử sử dụng StringLạng và nó hoạt động với tôi và tôi đang sử dụng EF6 RC1 vì vậy tôi không nghĩ các nhận xét đó là chính xác
Colin

5
Tại sao lại [MaxLength]có ErrorMessage?
Zapnologica

46

Một số thông tin bổ sung nhanh chóng nhưng cực kỳ hữu ích mà tôi vừa học được từ một bài đăng khác, nhưng dường như không thể tìm thấy tài liệu cho (nếu ai đó có thể chia sẻ liên kết đến nó trên MSDN sẽ rất tuyệt vời):

Các thông báo xác thực được liên kết với các thuộc tính này sẽ thực sự thay thế các trình giữ chỗ được liên kết với các thuộc tính. Ví dụ:

[MaxLength(100, "{0} can have a max of {1} characters")]
public string Address { get; set; }

Sẽ xuất ra các mục sau nếu vượt quá giới hạn ký tự: "Địa chỉ có thể có tối đa 100 ký tự"

Các trình giữ chỗ tôi biết là:

  • {0} = Tên tài sản
  • {1} = Độ dài tối đa
  • {2} = Độ dài tối thiểu

Rất cám ơn bloudraak vì đã chỉ ra điều này.


12

Sau đây là kết quả khi chúng tôi sử dụng cả hai [MaxLength][StringLength]thuộc tính, trong EF code first. Nếu cả hai được sử dụng, [MaxLength]chiến thắng cuộc đua. Xem kết quả kiểm tra trong studentnamecột ở bên dưới lớp

 public class Student
 {
    public Student () {}

    [Key]
    [Column(Order=1)]
    public int StudentKey { get; set; }

    //[MaxLength(50),StringLength(60)]    //studentname column will be nvarchar(50)
    //[StringLength(60)]    //studentname column will be nvarchar(60)
    [MaxLength(50)] //studentname column will be nvarchar(50)
    public string StudentName { get; set; }

    [Timestamp]
    public byte[] RowVersion { get; set; }
 }

7

Tất cả các câu trả lời tốt ... Từ góc độ xác thực, tôi cũng nhận thấy rằng MaxLạng chỉ được xác thực ở phía máy chủ, trong khi StringLạng cũng được xác thực ở phía máy khách.



3

Một điểm khác cần lưu ý là trong thuộc tính MaxLạng, bạn chỉ có thể cung cấp phạm vi yêu cầu tối đa không phải là phạm vi yêu cầu tối thiểu . Trong khi ở StringLạng bạn có thể cung cấp cả hai .


4
Có, nhưng đây có lẽ là lý do tại sao cũng có thuộc tính MinLạng: msdn.microsoft.com/EN-US/l
Ian Griffiths

1

Tôi đã giải quyết nó bằng cách thêm dòng dưới đây trong ngữ cảnh của tôi:

modelBuilder.Entity<YourObject>().Property(e => e.YourColumn).HasMaxLength(4000);

Bằng cách nào đó, [MaxLength]đã không làm việc cho tôi.


0

Khi sử dụng thuộc tính để hạn chế độ dài đầu vào tối đa cho văn bản từ một biểu mẫu trên trang web, StringLạng dường như tạo ra thuộc tính html maxlength (ít nhất là trong thử nghiệm của tôi với MVC 5). Sau đó, một trong những lựa chọn sẽ phụ thuộc vào cách bạn muốn cảnh báo người dùng rằng đây là độ dài văn bản tối đa. Với thuộc tính stringlength, người dùng sẽ không thể gõ vượt quá độ dài cho phép. Thuộc tính maxlength không thêm thuộc tính html này, thay vào đó, nó tạo ra các thuộc tính xác thực dữ liệu, nghĩa là người dùng có thể nhập vượt quá độ dài được chỉ định và việc ngăn chặn đầu vào dài hơn phụ thuộc vào xác thực trong javascript khi anh ta chuyển sang trường tiếp theo hoặc nhấp vào gửi (hoặc nếu javascript bị vô hiệu hóa, xác thực phía máy chủ). Trong trường hợp này, người dùng có thể được thông báo về sự hạn chế bằng một thông báo lỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.